IN和NOT IN子句不适用

时间:2015-07-17 02:51:51

标签: mysql database

所以我有这个问题:

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的产品。任何人都可以帮助识别此查询的问题吗?

1 个答案:

答案 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)

这似乎比你的做法简单。