MySQL获得具有多个标签ID的唯一列表

时间:2015-08-17 16:50:54

标签: php mysql sql left-join

我有2个名为tagsthings的表,两个表都包含idname列。然后,有第三个表:thing_tags。其中包含以下数据:

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

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

我想要做的是获取标记为#6和#12的唯一标识ID列表,因此在这种情况下,结果将是标识1和{{1} },但不是2,然后在3表中找到带有这些ID的元素并检索它们。这是我当前的SQL查询:

things

这不是我想要的方式,因为它也给了我表中的第三件事,并且多次返回正确的结果。我怎么能修改这个查询,以便只返回那些绑定到所有指定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 的{​​{1}}而不仅仅是一个things,而不会在最后有重复的行?

2 个答案:

答案 0 :(得分: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 :(得分: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