我正在通过 JOIN 查询查询两个表,以确定结果集列中的每一行approved是否为TRUE.
SELECT
`approvals`.`approved`
FROM `sign_ins`
RIGHT JOIN `approvals` ON
`sign_ins`.`user` = `approvals`.`user`;
Run Code Online (Sandbox Code Playgroud)
这将为每个用户返回一个布尔值的结果集,例如
1
0
0
1
1
Run Code Online (Sandbox Code Playgroud)
我的 PHP 代码遍历这些行,并通过返回 false 并在其中任何一个值为0. 但是,我认为如果不需要遍历结果集,它会更加高效和优化;毕竟,我真的只关心一件事:TRUE如果所有行的approved值都是TRUE; 否则,FALSE。
我可以用 MySQL 查询做到这一点吗?
谢谢。
我只想将COUNT()所有行与SUM()已批准的列进行比较。如果匹配,则所有行均为 1。如果不匹配,则至少有一个 0。
使用COUNT(approved)不会计算NULL值,因此您不需要对此进行补偿。
您的查询将如下所示:
SELECT (CASE WHEN COUNT(approved)=SUM(approved) THEN 1 ELSE 0 END)
FROM sign_ins
RIGHT JOIN approvals USING (user)
Run Code Online (Sandbox Code Playgroud)
应该返回 1(表示 TRUE)和 0(表示 FALSE)。
这是我的解决方案。我使用该MIN函数来选择最小值,因此0如果存在任何FALSE值,它应该返回。此外,由于它不是完全联接,因此表中不存在的登录approvals应被假定为未批准;因此,我曾经IFNULL提供一个默认FALSE值。
这是我的查询的完整示例(减去一些日期逻辑):
SELECT
MIN(IFNULL(`approvals`.`approved`, FALSE))
FROM `sign_ins`
LEFT JOIN `approvals` ON
`sign_ins`.`user` = `approvals`.`user`;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2355 次 |
| 最近记录: |