mysql - 选择在 () 中而不是在 () 中

标签 mysql sql

我有三个表

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; 

这里是 SQL Fiddle for the case

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

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/

相关文章:

php - 我的 PHP 代码中的参数有问题,参数未定义

php - 在 mySQL 数据库中用 PHP 更新表中的每一行

mysql - 用户无法执行选择错误 1142

mysql - SQL 仅选择列上具有最大值的行

sql - 提高 WHERE 子句中 EXTRACTVALUE 的性能

php - 如何从 HTML 表和数据库中删除查询?

mySQL,用新值替换第 n 个值

mysql - 累积具有相同ID但不同值的字段

MySQL if语句条件连接

php - 选择一列的最大值,按另一列分组不起作用