php - MySQL 获取具有多个标签 ID 的唯一事物列表

标签 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 的列表,因此在本例中,结果将是 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

这并没有按照我想要的方式工作,因为它还给了我表中的第三件事,并多次返回正确的结果。我如何修改此查询,以便仅返回那些绑定(bind)到所有指定 tagid(而不仅仅是一个)的 things,并且最终不会出现重复的行?

最佳答案

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 在语义上等同于“has AT LEAST 2”。

关于php - MySQL 获取具有多个标签 ID 的唯一事物列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055741/

相关文章:

php - 显示自定义帖子类型标题的列表

c# - Days 和 TotalDays 之间有什么区别?

php - SQL 中的 LIKE 不起作用

mysql - SQL查询给出错误结果

sql - 安装了 SQL server management studio 2012,但没有运行实例

php - 传输 MAMP SQL 数据库

php - 清理稍后将通过电子邮件发送的用户输入 - 我应该担心什么?

mySQL 错误 1040 : Too Many Connection

SQL:使用 WHERE AND 而不是 HAVING

php - 为傻瓜安全连接到 ldap