我有三个表
Articles Channels ArticlesChannels
pk id pk id pk articlePk channelPk
1 a1 1 c1 1 1 1
2 a2 2 c2 2 1 2
3 2 2
现在我想选择包含在一个集合中并排除在另一个集合中的所有文章。
示例:选择 channel a1 而不是 channel a2 的所有文章。
正确结果:因为两篇文章都在 channel c2 中,所以为空。
例如:选择 channel a1 的所有文章。
正确结果:第1条在C1 channel 中只有一条。
我的 SQL 看起来像这样:
SELECT a.id
FROM articles a, channels c, articlechannels ac
WHERE a.pk=ac.articlePk
AND ac.channelPk = c.pk
AND c.id IN ('a1')
AND c.id NOT IN ('a2');
问题是结果不排除存在于 c.id NOT IN ('a2') 中的结果。
有什么想法吗?
最佳答案
除了拼写错误外,您的查询看起来很好。
问题是它不符合这个要求:
Ex: Select all articles that have Channel a1 AND not Channel a2. Correct result: Empty since both articles are in Channel c2.
看起来你想要 Set1 minus Set2 操作,MySQL 不支持。
但是您可以使用类似这样的方法解决它:
select a.id, sum(case when c.id = 'c1' then 1 else 0 end) as c1, sum(case when c.id = 'c2' then 1 else 0 end) as c2
from Articles a
inner join ArticleChannels ac
on a.pk = ac.articlePk
inner join Channels c
on c.pk = ac.channelPk
group by a.id
having c1 = 1 and c2 = 0;
更新: 您还可以继续子查询:
SELECT a.id
FROM articles a, channels c, articlechannels ac
WHERE a.pk=ac.articlePk
AND ac.channelPk = c.pk
AND c.id IN ('a1')
AND a.id NOT IN (
SELECT a.id
FROM articles a, channels c, articlechannels ac
WHERE a.pk=ac.articlePk
AND ac.channelPk = c.pk
AND c.id NOT IN ('a2')
)
关于mysql - 选择在 () 中而不是在 () 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18845227/