标签系统 - 使用'某些标签'进行搜索而不使用“其他标签”

时间:2014-01-14 19:29:47

标签: php mysql search tags

我试图这样做:

两个输入:

1.“用标签搜索问题:”  2.“而且没有标签”

TABLE: questions (
-id,
-url,
 .
 .
 .
-other data
)

TABLE: tags (
-id,
-tag
)

TABLE: tags_and_questions (
-id,
-question_id,
-tag_id
)

SELECT `question_id` FROM `tags_and_questions` WHERE `tag_id` IN ($ok_tags_id) AND `tag_id` NOT IN ($no_tags_id)

表tags_and_questions中的数据示例:

question_id   tag_id
   1            1
   1            2
   1            3

当$ no_tags_id = 3时,获取tags_and_questions的结果是数组([0] => 1,[1] => 1)

这表可以吗?

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用带有having子句的聚合:

SELECT `question_id`
FROM `tags_and_questions`
GROUP BY question_id
HAVING sum(`tag_id` IN ($ok_tags_id)) > 0 and
       sum(`tag_id` NOT IN ($no_tags_id)) = 0;

这将返回带有“ok”标签中的一个或多个标签而没有“no”标签的问题。

当然,这种结构假定您实际上是在创建SQL作为字符串来传递它。否则,“lists”将被视为单个值。

编辑:

如果查询没有返回任何行,那么我怀疑这是因为你的列表是作为单个字符串进入的。在MySQL中,你可以这样做:

SELECT `question_id`
FROM `tags_and_questions`
GROUP BY question_id
HAVING sum(find_in_set(`tag_id`, $ok_tags_id) > 0) > 0 and
       sum(find_in_set(`tag_id`, $no_tags_id) > 0) = 0;