我有一个名为
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
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 查询列出给定标签下的图像:
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
:
tags.tag
等于"green"
,duplicates
,相关的任何
tags.id
duplicates.original
分组,将其“压缩”为一个,这样只有一个重复项“有效”,然后pics.*
。事后看来,您可能需要考虑在表
tags
和 duplicates
之间创建外键约束。
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
:
duplicates
2
,pics
与上面结果中的任何重复项关联,然后理想情况下,您想要删除重复项并标准化标签。但实际上,不这样做可能有一些合理的因素。简而言之,这取决于。™