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

时间:2014-11-02 23:26:51

标签: php mysql

我通过JOIN查询查询两个表,以确定结果集的approved列中的每一行是否为TRUE

SELECT
    `approvals`.`approved`
FROM `sign_ins`
RIGHT JOIN `approvals` ON
    `sign_ins`.`user` = `approvals`.`user`;

这将返回每个用户的布尔值的结果集,例如

1
0
0
1
1

我的PHP代码遍历这些行并确定是否只是通过返回false来批准所有行,如果这些值中的任何一个是0则断开循环。但是,如果没有必要迭代结果集,我认为它会更高效和最佳;毕竟,我真的只关心一件事:TRUE如果所有行的approved值都是TRUE;否则,FALSE

我可以使用MySQL查询吗?

感谢。

3 个答案:

答案 0 :(得分:2)

如果您只想要所有真实结果,请提出要求!

SELECT
    `approvals`.`approved`
FROM `sign_ins`
RIGHT JOIN `approvals` ON
    `sign_ins`.`user` = `approvals`.`user`;
WHERE `approvals`.`approved` = 1

答案 1 :(得分:1)

我只会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)

这应该返回1表示TRUE,0表示FALSE。

答案 2 :(得分:0)

这是我的解决方案。我使用MIN函数选择最小值,因此如果存在任何0值,则应返回FALSE。此外,由于它不是完整的连接,因此approvals表中不存在的登录应被视为未经批准;因此,我使用IFNULL来提供默认的FALSE值。

以下是我的查询的完整示例(减去某些日期逻辑):

SELECT
    MIN(IFNULL(`approvals`.`approved`, FALSE))
FROM `sign_ins`
LEFT JOIN `approvals` ON
    `sign_ins`.`user` = `approvals`.`user`;