我目前有以下(简化)sql,它从主表table1
中选择用户数据。此查询仅选择自给定日期以来尚未登录的用户。我使用子查询,因为登录表与主表分开。这两个表通过用户ID列相关。这非常有效。
// sql to get all records that haven't logged in since date above
$sql = "SELECT t1.*
FROM table1 t1
WHERE '2016-08-01' > (SELECT MAX(t2.DateCol)
FROM table2 t2
WHERE t2.userId= t1.userId)";
我的问题是,有没有办法返回MAX(t2.DateCol)
的值?
我厌倦了,但没有重新调整专栏
$sql = "SELECT t1.*, MAX(t2.DateCol) ....
仅供参考:此sql被解析为自定义PDO函数,因此无需警告mysql函数的不安全性。
答案 0 :(得分:0)
快速解决方案(不知道您的技能组或数据设置) - 在范围内移动子查询。
$sql = "SELECT t1.*,
(SELECT MAX(t2.DateCol)
FROM table2 t2
WHERE t2.userId= t1.userId) AS LastLogin
FROM table1 t1
HAVING '2016-08-01' > LastLogin ";
您需要使用HAVING
代替WHERE
,因为您正在使用别名进行比较。如果您的查询由于其他因素而无法使用HAVING
,则您需要重复子查询(不理想)。
答案 1 :(得分:0)
如果要显示聚合结果,则应从聚合中进行选择。为此,请按用户ID对您的聚合进行分组。您可以使用HAVING
仅选择所需的内容。
select t1.*, t2.max_datecol
from table1 t1
join
(
select userid, max(datecol) as max_datecol
from table2
group by userid
having max(datecol) < date '2016-08-01'
) t2 on t2.userid = t1.userid;