2015-08-17 95 views
2

我有两个表,分别名为tagsthings,它们都包含一个id和一个name列。然后,还有第三个表格:thing_tags。其中有数据是这样的:MySQL获取具有多个标记ID的事物的唯一列表

╔═══════╤═════════╗ 
║ tagid │ thingid ║ 
╟───────┼─────────╢ 
║  6 │  1 ║ 
║  6 │  2 ║ 
║ 12 │  1 ║ 
║ 12 │  2 ║ 
║ 12 │  3 ║ 
║ 15 │  4 ║ 
║ 16 │  4 ║ 
║ 21 │  5 ║ 
╚═══════╧═════════╝

的2列有各表的id列外键引用。

我希望做的是得到的同时具有标签#6,#12,独特的东西ID的列表所以在这种情况下,结果将是标识12,但不3,然后在things表中查找具有这些ID的元素并检索它们。这里是我当前的SQL查询:

SELECT th.* 
FROM thing_tags t 
LEFT JOIN things th ON t.id = th.id 
WHERE t.id IN (12,6) 
ORDER BY th.name ASC 

这不工作,我希望它的方式,因为它也给了我第三次生命从表中,并返回正确的结果多次。我如何修改此查询,以便只返回那些绑定到所有指定的tagidthings,而不仅仅是一个,最终没有重复的行?

回答

3

in(...)or比较,而您需要and。你不能改变in行为,但您可以添加额外的逻辑到查询的其余部分,使in行为,如果它确实有and语义:

SELECT field1, COUNT(field2) AS cnt 
FROM yourtable 
WHERE field2 IN (6, 12) 
GROUP BY field1 
HAVING cnt = 2 

count()告诉你有多少的in的字段存在,然后使用having子句来强制实施您想要的数量。在你的情况下,你只需要2,所以你使用= 2

having cnt > 2在语义上等同于“具有至少2”。

1

这是我最后一次尝试::)

select things.* from things 
inner join thing_tags a on a.thingid = things.id and a.tag_id = 6 
inner join thing_tags b on b.thingid = things.id and b.tag_id = 12 
+0

我发布这个问题之前尝试过类似的解决方案,而MySQL返回的错误,指出“LIMIT&AND/OR/IN与子查询不支持这个版本的MySQL“。 AFAIK我正在运行最新版本。 – SeinopSys

+0

@ DJDavid98感谢您的回复。我用另一个选项更新了我的答案。请让我知道这是否可行 – Akshay

+0

您在两种解决方案中都使用'IN'和子查询。我的MySQL服务器不允许。 – SeinopSys

相关问题