找到所有有红球和蓝球的罐子

Posted

技术标签:

【中文标题】找到所有有红球和蓝球的罐子【英文标题】:Find all jars that have red balls and blue balls 【发布时间】:2021-05-08 12:11:27 【问题描述】:

通过这个简单的查询,我可以找到所有包含 红球蓝球的罐子的 ID:

SELECT id FROM "Jars" J
JOIN "Balls" B ON B.jarId = J.jarId
WHERE B.color = 'red' OR B.color = 'blue'
GROUP BY id

我如何找到所有包含 红球蓝球的罐子的 ID?

【问题讨论】:

与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/… 【参考方案1】:

您不需要子查询。您甚至不需要 JOIN,因为您只需要罐子的 ID(可在 balls 表中找到)

select b.jarid
from balls b
where b.color in ('blue', 'red')
group by b.jarid
having count(*) = 2

请注意,这也会返回具有其他颜色(例如蓝色、红色和黄色)的球。

如果你只想要那些完全蓝色和红色的,你可以使用这个:

select jarid
from balls
group by jarid
having count(*) = 2 
and bool_and(color in ('blue', 'red'))

【讨论】:

【参考方案2】:

如果两者都是你想要的,那就试试吧:

SELECT id
  FROM (
SELECT j.id,
       COUNT(CASE WHEN b.colour = 'red' THEN b.id ELSE NULL END) as reds,
       COUNT(CASE WHEN b.colour = 'blue' THEN b.id ELSE NULL END) as blues
  FROM Jars j INNER JOIN Balls b ON j.jarId = b.jarId
WHERE b.color IN ('red', 'blue')
GROUP BY j.id) tmp
 WHERE tmp.reds > 0 and tmp.blues > 0;

【讨论】:

ty,这行得通,虽然我希望得到一个不涉及子查询的更简单的答案,但也许这是不可能的。

以上是关于找到所有有红球和蓝球的罐子的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1824染色游戏

Let‘s Play Curling

Yahoo Programming Contest 2019 F - Pass

国家扶贫项目福彩双色球玩法规则

基于Java SE的模拟双色球彩票系统

Codeforces 399B - Red and Blue Balls