2012-07-29 156 views
2

我有一個頁面顯示與您聊天的人員列表。目前它正在顯示你一直在聊天的人和OLDEST消息。但是,它應該顯示NEWEST消息。這是查詢:ORDER BY GROUP BY

SELECT * FROM post 
WHERE fk_user_to = '$userid' 
GROUP BY fk_user_from 
ORDER BY datotime DESC 

和表結構

post_id || fk_user_to || fk_user_from || message || datotime 
+0

我假設你試過ASC代替DESC的? – 2012-07-29 22:19:36

+0

什麼*類型的SQL,請。 – RBarryYoung 2012-07-29 22:33:51

+0

是的,我有,斯坦尼斯拉夫。 它是MySQL – 2012-07-29 22:51:13

回答

2

這工作了:

SELECT * FROM 
    (SELECT * FROM post ORDER BY datotime DESC) as inv 
    WHERE fk_user_to = '$userid' 
    GROUP BY fk_user_from 
    ORDER BY datotime DESC 
0

它不會真的這樣做。你永遠不能確定GROUP BY選擇哪一行,因此在它上面放置一個ORDER BY將會產生不可預測的結果。您也不能在GROUP BY之前下單。

試試這個:

SELECT *,MAX(datotime) AS dt fk_user_from 
FROM post 
WHERE fk_user_to = '$userid' 
GROUP BY fk_user_from 
ORDER BY dt 
+0

這不會提供最新的'message'行值。 – dronus 2012-07-29 22:33:27

0

沒有與普通的SQL沒有簡單的解決方案,我認爲。如果你的數據庫系統允許的子查詢,你得做一個子查詢像

SELECT fk_user_from AS id, MAX(dateotime) AS newest_timestamp FROM post WHERE fk_user_to = '$userid' 

,然後再次使用這兩個領域爲重點,從post選擇。

在MySQL中,可能是這樣的:

SELECT * FROM post P1 
JOIN (
    SELECT fk_user_from, MAX(dateotime) AS newest_dateotime 
    FROM post 
    WHERE fk_user_to = '$userid' 
    GROUP BY fk_user_from 
) AS P2 
ON P1.fk_user_from=P2.fk_user_from 
AND P1.datotime =P2.newest_dateotime 
WHERE P1.fk_user_to = '$userid' 
+0

我收到一個錯誤,使用它。 #1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'WHERE fk_user_to ='1'附近使用正確的語法)AS P2 ON P1.fk_user_from = P2.fk_user_from第6行的AND P1' – 2012-07-29 22:41:51

+0

WHERE和GROUP BY在哪裏洗牌,我已經糾正了,也許現在再試一次。該代碼當然沒有經過測試,因爲我無法訪問您的數據庫.. – dronus 2012-07-29 23:04:22