2017-04-21 85 views
0

我目前有以下(简化)sql从主表中选择用户数据table1。此查询仅选择自给定日期以来未登录的用户。由于登录表与主表是分开的,因此我使用子查询。这两个表通过用户标识列相关。这工作完美。从子查询中获取列

// 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)的值? 我厌倦了这一点,但就是没有reconise列

$sql = "SELECT t1.*, MAX(t2.DateCol) .... 

FYI:这个SQL被解析成一个自定义的PDO功能,所以没有必要发出警告的MySQL函数的不安全感。

+0

见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

+1

好吧,你必须警告有关PDO函数的insecirutues,当它们被用作mysql函数 –

+0

的相同方式时,你似乎是mysql的新手;你得到什么错误?检查他们并告诉我们它是什么。请参阅http://php.net/manual/en/pdo.error-handling.php和http://php.net/manual/en/function.error-reporting.php并将其应用于您的代码。 –

回答

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,则需要重复子查询(不理想)。

0

如果要显示聚合结果,则应从聚合中进行选择。为此,请按照用户标识对您的聚合进行分组。您可以使用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;