2017-08-16 47 views
0

所以我有一個消息表和一個聊天表。這些消息具有日期和他們所在聊天的ID。現在,我要選擇每個聊天的最新消息。爲此,我需要最大的日期,它必須與郵件的日期相同。否則,我會收到來自此聊天的隨機消息。 如果我這樣做,它會告訴我'where子句'中的未知列'maxdate'',我不知道爲什麼。我也可以通過這個專欄來訂購。使用max時,where子句中的SQL未知列

這裏是我的查詢:

SELECT Chats.cid, cname, mtext, MAX(mdate) AS maxdate 
FROM Chats 
LEFT JOIN Messages ON Chats.cid = Messages.cid 
WHERE maxdate = mdate 
GROUP BY cid 
ORDER BY maxdate DESC 
+0

讓你的where子句有一個。這裏有兩個問題。首先,別名max(mdate)在where子句中不可用,因爲由於操作順序。 where子句在別名處於作用域之前執行。其次,即使別名在範圍內,max(mdate)還沒有被計算出來。因此存在着。它旨在讓您在聚合發生後進行過濾。 – xQbert

+0

用您正在使用的數據庫標記您的問題。 –

+0

該GROUP BY無效。一般的GROUP BY規則說:「如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或作爲set函數的參數。」 – jarlh

回答

0

您正在尋找這樣的事情:

SELECT c.cid, c.cname, m.mtext, mdate 
FROM Chats c LEFT JOIN 
    Messages m 
    ON c.cid = m.cid AND 
     m.mdate = (SELECT MAX(m2.mdate) FROM Messages m2 WHERE m2.cid = c.id) 
ORDER BY mdate DESC; 

因爲你用的是LEFT JOIN,但重要的是,相比於最大那張ON子句。

0

改變這樣的:

WHERE maxdate = mdate 

到這樣的事情

WHERE mdate = (select max(mdate) from etc) 

此外,在SELECT子句,改變

MAX(mdate) AS maxdate 

mdate 
+0

我想你的意思是'WHERE mdate =(從等選擇max(mdate))' – user2877959

+0

但是我不能指定我在看哪個聊天,可以嗎? 我只會得到所有消息的最新日期。 – MoLi0003

0

請嘗試此查詢。

SELECT Chats.cid, cname, mtext, mdate 
FROM Chats 
LEFT JOIN Messages ON Chats.cid = Messages.cid 
INNER JOIN (SELECT Chats.cid cid, MAX(mdate) AS maxdate 
      FROM Chats 
      LEFT JOIN Messages ON Chats.cid = Messages.cid 
      GROUP BY Chats.cid) tmp ON tmp.maxdate = mdate AND tmp.cid = Chats.cid 
ORDER BY mdate DESC 
+0

工程,但我沒有沒有消息聊天;) – MoLi0003

+0

您可以使用左連接,而不是內部連接 –