所以我有这个问题:
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的产品。任何人都可以帮助识别此查询的问题吗?
答案 0 :(得分:1)
如果您想要标记为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)
。
这似乎比你的做法简单。