MySQL - 选择每一行的列是否为真?

M M*_*ler 5 php mysql

我正在通过 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 查询做到这一点吗?

谢谢。

wol*_*her 5

我只想将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)。


M M*_*ler 1

这是我的解决方案。我使用该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)