如何在我的查询中仅使用 COUNT(*) 来查找只有红船的日子?
Posted
技术标签:
【中文标题】如何在我的查询中仅使用 COUNT(*) 来查找只有红船的日子?【英文标题】:How to use only COUNT(*) in my query to find days with only red boats? 【发布时间】:2019-02-03 22:26:38 【问题描述】:鉴于下面的数据库,我试图找出一种方法,我可以从保留表中列出仅使用 COUNT() 函数保留红船的日期。从表格看,应该只显示周一和周日,因为那些日子只有红船。星期三不应该包括在内,因为那天还有一艘蓝色的船。我不完全确定如何仅使用 COUNT() 来执行此操作。
(水手) 姓名评分 布鲁图斯 1 安迪 8 霍拉肖 7 生锈的 8 鲍勃 1
(预订) sname bname day
安迪·因特莱克星期一 安迪湾星期三 安迪海洋星期六 生锈湾周日 生锈的因特拉克星期三 生锈的海洋星期三 鲍勃湾星期一
(船) bname 颜色等级 SpeedQueen 白色 9 因特拉克红 8 海洋蓝 7 湾红3
(全天) 天 星期一 星期二 星期三 星期四 星期五 星期六 周日
到目前为止,我已经设法想出了以下内容,尽管它应该只显示星期一和星期日。
select distinct day
from reservation
where (
select count(*)
from reservation r, boat b
where r.day=reservation.day and
r.bname=b.bname and
r.color = 'red')
以下是显示的内容: 星期一 星期三 周日
编辑:对表格中的间距感到抱歉。我希望这是有道理的。
【问题讨论】:
创建表并插入语句来描述您的表。此外,您不需要计数功能。 (拿回来,只需要计数) 我不明白您所说的“仅使用 count() 函数”是什么意思。您的示例使用 distinct、joins、where 子句和子表;如果我可以自己使用所有这些,我可以给你一个甚至不需要 count(*) 的答案 我强烈建议避免隐式连接并使用ON
语句显式命名连接类型(在这种情况下为INNER JOIN
)。
【参考方案1】:
SELECT rcount.day
(
SELECT day, COUNT(*) AS cnt
FROM reservations
GROUP BY day
) rcount
JOIN
(
SELECT day, COUNT(*) AS cnt
FROM reservations res JOIN boats b ON res.bname = b.bname
WHERE b.color = 'red'
GROUP BY day
) red_res_count
ON rcount.day = red_res_count.day
WHERE red_res_count.cnt = rcount.cnt
这会获取每天的预订总数,并将它们与每天的红色预订数量相结合。如果红色预订数 = 当天的总预订数,则您知道只有红色预订。
【讨论】:
【参考方案2】:这是一种方法:
select r.day
from reservations r join
boats b
on r.bname = b.bname
group by r.day
having count(*) = count(case when b.color = 'red' then b.bname end);
【讨论】:
以上是关于如何在我的查询中仅使用 COUNT(*) 来查找只有红船的日子?的主要内容,如果未能解决你的问题,请参考以下文章
Android如何从同一个数组中仅显示列表视图中的某些项目?