SQL:仅输出每个框中的球的颜色

标签 sql count having relational-division

我正在尝试解决这个 SQL 问题,我有十几个不同颜色的球和几个盒子。现在,我正在尝试编写一个 SQL 查询来输出每个框中的球的颜色。因此,如果绿球存在于盒子 A、B 和 C 中,但蓝球和红球仅存在于 3 个盒子中的 1 或 2 个中,那么我应该只输出绿色。

我有三个表:

盒子

ID  |
====|
A   |
B   |
C   |

Number | boxid | colorid |
=======|=======|=========|
1      |A      | Green   |
2      |A      | Red     |
3      |A      | Blue    |
4      |B      | Green   |
5      |B      | Red     |
6      |NULL   | Blue    |
7      |C      | Green   |
8      |NULL   | Red     |
9      |NULL   | Blue    |
10     |NULL   | Green   |
11     |NULL   | Red     |
12     |NULL   | Blue    |

NULL 表示它们不在任何盒子内

颜色

Name  |
======|
Blue  |
Red   |
Green |

现在,起初我认为我可以使用以下代码解决这个问题:

SELECT colorid
FROM Ball
GROUP BY colorid
HAVING COUNT(colorid) = (SELECT COUNT(*) FROM Box) 
OR COUNT(colorid) > (SELECT COUNT(*) FROM Box)

但后来我意识到,一旦你给 boxid 上有 NULL 的行赋值,它也会输出这些颜色,因为我的 SQL 查询没有考虑到彩色球必须位于所有三种不同的颜色中盒子,只是所有三个彩色球都在任何盒子里。

我很困惑如何更改我的查询,以便仅当球位于与另一个盒子不同的盒子中时才有效。请帮忙。

最佳答案

假设我们知道不同盒子的数量是 3:

  SELECT colorId 
    FROM Ball
   WHERE boxid IS NOT NULL
GROUP BY colorId
  HAVING COUNT (DISTINCT boxid) = 3

否则

  SELECT colorId 
    FROM Ball
   WHERE boxid IS NOT NULL
GROUP BY colorId
  HAVING COUNT (DISTINCT boxid) = SELECT COUNT (DISTINCT ID) FROM Box

如果球可以位于与 Box 中的三个不同的盒子中,那么我们需要一个子查询来仅计算我们关心的盒子中的球。

  SELECT colorId 
    FROM Ball
   WHERE EXISTS(SELECT 1 FROM Box WHERE ID = boxid)
GROUP BY colorId
  HAVING COUNT (DISTINCT boxid) = SELECT COUNT (DISTINCT ID) FROM Box

关于SQL:仅输出每个框中的球的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20712742/

相关文章:

mysql - 有没有办法在 Eloquent 中使用 SUM 编写这个 HAVING 查询而不需要原始数据?

php - 带有 MySQL 查询的 Foreach 循环

php - 如何从表中删除重复/对应的值?

mysql - [MySQL]如何对选择子句中具有特定分组的行进行计数

MySQL/Ruby on Rails - 如何将 "SUM"写入 :has_many case

sql - 如何编写 SQLite 代码以显示指定代码及其来自 group_concat 函数的关联代码?

mysql - 查找每个用户在 MySQL 表中的最新位置

sql - 为什么这个查询这么慢?

sql - 为什么带有 NULL 列的 count( distinct ) 在 Hive SQL 中返回 0?

php - 如何计算数据库中的列,如果为空则返回 0 PHP