3

我有三张桌子

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

现在我想选择包含在一个集合中并排除在另一个集合中的所有文章。

例如:选择所有具有频道 a1 而不是频道 a2 的文章。
正确结果:由于两篇文章都在频道 c2 中,因此为空。

例如:选择所有具有频道 a1 的文章。
正确结果: Channel c1 中只有Article1 一条。

我的 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') 中存在的结果。

有任何想法吗?

4

1 回答 1

2

您的查询看起来很好,除了拼写错误。

问题是它不符合这个要求:

例如:选择所有具有频道 a1 而不是频道 a2 的文章。正确结果:由于两篇文章都在频道 c2 中,因此为空。

看起来你想要 Set1 减去 MySQL 不支持的 Set2 操作。

但是您可以使用以下方法解决它:

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; 

这是案例的 SQL Fiddle

更新:您还可以继续使用子查询:

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')
)
于 2013-09-17T09:43:37.273 回答