如何使用SQL实现tag1 + tag2 + ...搜索

时间:2012-06-22 01:35:35

标签: mysql

我有一个对象,标签和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方法?

1 个答案:

答案 0 :(得分:3)

您可以将HAVING子句与GROUP BY结合使用来回答涉及所有某些内容的问题......

SELECT
    obj_id
FROM
    tag_relationships
WHERE
    tag_id IN (1,3)
GROUP BY
    obj_id
HAVING
    COUNT(*) = 2

2中的COUNT(*)代表您要搜索的代码数量。如果您想要满意的对象,三个标签......(例如1,3,6),您可以将COUNT(*)提升到3