2017-04-21 71 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;