我试图这样做:
两个输入:
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)
这表可以吗?
答案 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;