所以我有这个查询:
SELECT m.id, (
SELECT GROUP_CONCAT(
DISTINCT tag_id
ORDER BY tag_id
SEPARATOR '-'
) FROM tagging
WHERE mng_id = m.id
ORDER BY tag_id DESC
) as tags
FROM product m
INNER JOIN tagging tg ON (m.id = tg.mng_id)
WHERE 1
AND tg.tag_id IN (34,20) AND tg.tag_id NOT IN (42)
AND (nme LIKE 'tomo%' OR alt_nme LIKE 'tomo%')
GROUP BY m.id
此查询应返回标签为 # 34、20 且没有标签 # 42 的记录,记录名称必须以“tomo”开头。
但由于某种原因,它不会从结果中删除带有标签 #42 的产品。任何人都可以帮助确定此查询的问题吗?
最佳答案
如果您想要标签为 34 和 20 而不是 42 的记录,请尝试如下操作:
SELECT p.id
FROM product p INNER JOIN
tagging tg
ON p.id = tg.mng_id
GROUP BY p.id
HAVING SUM(tg.tag_id = 34) > 0 AND
SUM(tg.tag_id = 20) > 0 AND
SUM(tg.tag_id = 42) = 0;
如果您想要生成的标签,只需添加 group_concat(tg.tag_id)
。
这似乎比你的方法更简单。
关于mysql - IN 和 NOT IN 子句不适用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467704/