MySQL加入了NOT IN和WHERE IN(类别)

时间:2018-07-12 15:30:27

标签: mysql sql

我有一个类别UID的白名单和黑名单。

我正试图告诉MySQL

  • 我希望所有页面至少具有“ 57”,但
  • 我不希望任何页面也具有“ 206”的页面。

通常,我会说“ IN(57)”排除了其他所有内容,例如206,但是某些页面同时具有(57和206),因此这两种方法都是正确的。 仍然包含不需要的206页。

这是查询:

SELECT pages.uid, pages.title
FROM pages 
LEFT JOIN sys_category_record_mm AS cats ON (pages.uid = cats.uid_foreign AND cats.tablenames="pages" AND cats.fieldname="categories") 
WHERE pages.hidden=0 AND pages.deleted=0 
AND cats.uid_local IN (57) 
AND cats.uid_local NOT IN (206) 
ORDER BY (CASE WHEN pages.starttime > 0 THEN pages.starttime ELSE pages.crdate END) DESC 
LIMIT 10

这是此问题的 DB提琴手

https://www.db-fiddle.com/f/fxGQbBVZHb8aJDJ4eiTUW1/0

我没主意了。任何帮助/提示将不胜感激

1 个答案:

答案 0 :(得分:1)

我发现使用group byhaving这种逻辑最简单:

select c.uid_foreign
from sys_category_record_mm c
where c.tablenames = 'pages' AND c.fieldname = 'categories' 
group by c.uid_foreign
having sum(c.uid_local in (57)) > 0 and
       sum(c.uid_local in (206)) = 0;

您可以返回页面以获取更多信息。