如何在我的查询中仅使用 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 应用程序中仅启用英文键盘?

如何使用 api 在谷歌地图中仅显示一个国家或特定区域?

Android如何从同一个数组中仅显示列表视图中的某些项目?

如何在 IntelliJ 的 logcat 中仅过滤我的应用程序日志? [复制]

如何在我的应用程序中仅打印一次警报视图?