我有一个类别UID的白名单和黑名单。
我正试图告诉MySQL
通常,我会说“ 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
我没主意了。任何帮助/提示将不胜感激
答案 0 :(得分:1)
我发现使用group by
和having
这种逻辑最简单:
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;
您可以返回页面以获取更多信息。