Mysql 如何实现tag1+;标记2+;。。。仅使用SQL进行搜索

Mysql 如何实现tag1+;标记2+;。。。仅使用SQL进行搜索,mysql,Mysql,我有一个对象、标记和标记关系表。对象和标记都有一个id列,标记和标记关系将两者连接起来 tag_关系示例(在下面的示例中使用): 我想实现一个和搜索,允许人们过滤标签。只应返回包含所有给定标记ID的行的obj_ID。例如: 示例输入:1,3(实际上是标记名,但会转换为ID) 所需输出:2 感觉这应该很容易,但就我的一生而言,我想不出一个简单的方法来做到这一点。我目前正在考虑返回一个表,其中包含具有给定tag_id的tag_关系中的所有行,然后使用PHP对它们进行排序。是否有一种更简单、仅SQL的

我有一个对象、标记和标记关系表。对象和标记都有一个id列,标记和标记关系将两者连接起来

tag_关系示例(在下面的示例中使用):

我想实现一个和搜索,允许人们过滤标签。只应返回包含所有给定标记ID的行的obj_ID。例如:

示例输入:1,3(实际上是标记名,但会转换为ID)

所需输出:2


感觉这应该很容易,但就我的一生而言,我想不出一个简单的方法来做到这一点。我目前正在考虑返回一个表,其中包含具有给定tag_id的tag_关系中的所有行,然后使用PHP对它们进行排序。是否有一种更简单、仅SQL的方法?

您可以将
HAVING
子句与
groupby
结合使用,以回答涉及所有内容的问题

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

COUNT(*)
中的
2
表示您正在搜索的标签数量。如果您想要满足以下条件的对象,例如,三个标记。。。(例如,
1,3,6
),您可以将
计数(*)
增加到
3

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

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

COUNT(*)
中的
2
表示您正在搜索的标签数量。如果您想要满足以下条件的对象,例如,三个标记。。。(例如,
1,3,6
),您可以将
计数(*)
增加到
3

,这几乎就像这个问题以前已经解决了[很多次]。。。两种简单的方法很容易实现这一点:
COUNT(…其中x IN(1,3))=2
(或者是一个派生表而不是
IN
)和
连接(根据需要多次连接),其中t1.x=1和t2.x=3
。也就是说,在MySQL中至少有3种不同的“预处理”方法来解决这个问题(不一定只是表格格式)他们的优点和缺点…不必要的粗鲁,但你的解决方案奏效了!谢谢pst!我不是故意粗鲁,如果是这样的话,我道歉:)像这样的事情都是“已解决的问题”;这并不是说它们不能[重新]派生,而是使用现有的解决方案可以利用现有的工作(例如,如何扩展?)。很高兴你找到了工作。如果我是一个更高效的搜索者,我可能会找到一个。但我完全同意你的观点。这个问题好像已经解决了很多次了。。。两种简单的方法很容易实现这一点:
COUNT(…其中x IN(1,3))=2
(或者是一个派生表而不是
IN
)和
连接(根据需要多次连接),其中t1.x=1和t2.x=3
。也就是说,在MySQL中至少有3种不同的“预处理”方法来解决这个问题(不一定只是表格格式)他们的优点和缺点…不必要的粗鲁,但你的解决方案奏效了!谢谢pst!我不是故意粗鲁,如果是这样的话,我道歉:)像这样的事情都是“已解决的问题”;这并不是说它们不能[重新]派生,而是使用现有的解决方案可以利用现有的工作(例如,如何扩展?)。很高兴你找到了工作。如果我是一个更高效的搜索者,我可能会找到一个。但我完全同意你的观点。这太完美了!谢谢ZaneYep。这太完美了!谢谢Zane