我通过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查询吗?
感谢。
答案 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`;