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

标签 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 的方法?

最佳答案

您可以使用HAVINGGROUP BY 结合使用的条款回答涉及某事全部的问题...

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

2COUNT(*)代表您正在搜索的标签数量。如果您想要满足三个标签的对象...(例如 1,3,6 ),您可以增加 COUNT(*)3 .

关于mysql - 如何仅使用 SQL 实现 tag1+tag2+... 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11149175/

相关文章:

mysql - 我需要从 mysql 表中获取所有唯一数据并将其放入新表中

mysql - 将数据库从一台主机移动到另一台主机时出现 phpMyAdmin 错误

javascript - 序列化查询 : How to find column, "where:"列值不等于数组中的任何值

mysql - 获取mysql表的总和并加入另一个表以获取名称

php - 使用准备好的 PDO 语句

mysql - 用户体重历史数据库设计

php - Magento 后端自定义地址属性

mysql - 具有重复值的 JOIN 上的更新表仅返回第一个值

MySQL:根据A表和B表的数据更新表A

mysql - 无法在 case when 语句中放入子查询条件