我有一个对象、标签和tag_relationships表。对象和标签各有一个 id 列,tag_relationships将两者连接起来。
tag_relationships示例(在下面的示例中使用):
+--------+--------+
| obj_id | tag_id |
+--------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 2 | 4 |
+--------+--------+
我想实现 AND 搜索以允许人们过滤标签。只应返回包含所有给定tag_ids行的obj_ids。例如:
示例输入:1、3(实际上是标签名称,但它们会转换为 id)
期望输出:2
感觉这应该很容易,但对于我的生活,我想不出一个简单的方法来做到这一点。我目前正在考虑返回一个表,其中包含tag_relationships中具有给定tag_ids之一的所有行,然后使用 PHP 对它们进行排序。有没有更简单的、仅使用 SQL 的方法?
HAVING
子句与GROUP BY
结合使用来回答涉及所有内容的问题...
SELECT
obj_id
FROM
tag_relationships
WHERE
tag_id IN (1,3)
GROUP BY
obj_id
HAVING
COUNT(*) = 2
COUNT(*)
中的2
表示您正在搜索的标签数。如果你想要满足的对象,比如说,三个标签...(例如 1,3,6
),你会把COUNT(*)
提高到3
。