如何查询包含已知重复项且也带有标签的主表?

问题描述 投票:0回答:1

我有一个名为

pics
的主表,其中包含 ID 号和从中提取数据的源站点。我还有另一个名为
tags
的表,其中包含也从该网站提取的所有标签的列表。这是最关键的,有已知的重复项。已知重复项的方式无关紧要。
duplicates
也存储在它们自己的表中。第一列“original”是“pics”表中的第一个实例。第二列是任何
additional
重复项。该网站根据标签搜索图像,标签可以是多个。 (我知道将源站点放在
pics
表中可能不是最佳的,也不是正确的数据库设计。)
这必须适用于 MySQL/phpMyAdmin。

1。搜索特定标签时会列出所有图像 ID 号的 SQL 连接查询是什么?例如:

  • 搜索字符串:
    fire
    ,结果:
    [null]
  • 搜索字符串:
    red
    ,结果:
    #1
  • 搜索字符串:
    vines
    ,结果:
    #2
  • 搜索字符串:
    green
    ,结果:
    #2
  • 搜索字符串:
    forest brown
    ,结果:
    #2
  • 搜索字符串:
    bird tree
    ,结果:
    [null]

2。合并图像源站点的 SQL 连接查询是什么?例如:

  • 图像站点:
    1
    ,结果:
    colors.com
  • 图像站点:
    2
    ,结果:
    colors.com
    nature.com
  • 图像站点:
    4
    ,结果:
    nature.com
  • (获取#5 和#6 的站点并不重要,因为无论如何它们总是会引用#2。)

3.或者老实说,不做这种复杂的连接工作,而是做更简单的连接查询,并有一个自动化的、预定的过程,手动合并标签并删除重复的条目,会更容易吗?

以下是复制粘贴到空白数据库的 SQL:

START TRANSACTION;
CREATE TABLE `duplicates` (`original` int(2) NOT NULL,`additional` int(2) NOT NULL);
INSERT INTO `duplicates` (`original`, `additional`) VALUES (2, 5),(2, 6);
CREATE TABLE `pics` (`id` int(2) NOT NULL,`sourceSite` text NOT NULL);
INSERT INTO `pics` (`id`, `sourceSite`) VALUES (1, 'colors.com'),(2, 'colors.com'),(3, 'colors.com'),(4, 'nature.com'),(5, 'nature.com'),(6, 'nature.com');
CREATE TABLE `tags` (`id` int(2) NOT NULL,`tag` varchar(16) NOT NULL);
INSERT INTO `tags` (`id`, `tag`) VALUES (1, 'red'),(1, 'orange'),(2, 'green'),(2, 'brown'),(3, 'blue'),(3, 'cyan'),(4, 'bird'),(4, 'flight'),(5, 'tree'),(5, 'forest'),(6, 'vines'),(6, 'tree');
ALTER TABLE `duplicates` ADD KEY `original` (`original`), ADD KEY `additional` (`additional`);
ALTER TABLE `pics` ADD PRIMARY KEY (`id`);
ALTER TABLE `tags` ADD KEY `id` (`id`);
ALTER TABLE `duplicates` ADD CONSTRAINT `duplicates_ibfk_1` FOREIGN KEY (`original`) REFERENCES `pics` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `duplicates_ibfk_2` FOREIGN KEY (`additional`) REFERENCES `pics` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `tags` ADD CONSTRAINT `tags_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pics` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
COMMIT;
sql mysql join phpmyadmin mariadb
1个回答
0
投票

这是您的架构的图形表示。让我们一起努力吧。

  1. SQL 查询列出给定标签下的图像:

    SELECT pics.*
    FROM tags
        LEFT JOIN duplicates ON tags.id = duplicates.original OR tags.id = duplicates.additional
        LEFT JOIN pics on duplicates.original = pics.id
    WHERE tags.tag = "green"
    GROUP BY duplicates.original;
    

    也就是说,给定一个输入标签,例如

    green

    1. 查询
      tags.tag
      等于
      "green"
      ,
    2. 的标签
    3. 拉出与
      duplicates
      ,
       相关的任何 
      tags.id
    4. 将这些重复项按
      duplicates.original
      分组,将其“压缩”为一个,这样只有一个重复项“有效”,然后
    5. 根据上面的结果得到对应的
      pics.*

    事后看来,您可能需要考虑在表

    tags
    duplicates
    之间创建外键约束。

  2. SQL查询列出图像源站点:

    SELECT pics.sourceSite
    FROM duplicates
        LEFT JOIN pics ON duplicates.additional = pics.id
    WHERE duplicates.original = 2 OR duplicates.additional = 2
    GROUP BY pics.sourceSite
    

    也就是说,给定一个输入图像 ID,例如

    2

    1. 查找引用图像 ID 的
      duplicates
      2
      ,
    2. 查询
      pics
      与上面结果中的任何重复项关联,然后
    3. 分组并选择这些图片的源站点。
  3. 理想情况下,您想要删除重复项并标准化标签。但实际上,不这样做可能有一些合理的因素。简而言之,这取决于。™

© www.soinside.com 2019 - 2024. All rights reserved.