2012-01-13 148 views
2

這裏是我的代碼:SQL GROUP BY選擇

mysql_query("SELECT * FROM messages WHERE to_user_id = '$user_id' GROUP BY from_user_id ORDER BY read,sent_date DESC")

,這裏是我的表結構

enter image description here

我用GROUPY BY from_user_id聲明簡要地顯示 「對話」 列表而不是每一條消息。像這樣

enter image description here

,因爲你可以在圖片中看到,前兩名分別是南轅北轍,第一個說「1個星期前」和下面的人說「2天前」。這些錯誤的原因是由於GROUP BY from_user_id聲明。因爲它將來自該用戶的所有消息分組,並且它不會擁有最近的時間。

所以我的問題是:

我怎樣才能GROUP BY from_user_id由最近的記錄?

+0

的數據庫軟件? – 2012-01-13 18:52:02

+0

剛剛重新綁定了MySQL。由於包含PHP代碼中的'mysql_query'語句,並且因爲只有MySQL允許您以這種方式濫用GROUP BY語義,所以它必須是。 :S – 2012-01-13 18:53:01

+0

按from_user_id分組意味着無論涉及多少個對話,該用戶的帖子都會有一個行輸出。您的表是否有對話ID字段? – 2012-01-13 18:56:33

回答

1

嘗試用這種

SELECT *,MAX(id) as OrderField FROM messages WHERE to_user_id = '$user_id' 
GROUP BY from_user_id 
ORDER BY OrderField DESC,read 
2

由於MySQL不支持窗口函數像ROW_NUMBER() OVER()你可以做這樣的事情:

SELECT * 
FROM Messages 
where id in (SELECT MAX(ID) FROM messages GROUP BY from_user_id) 
ORDER BY sent_date, read 

子查詢只會返回最新的消息ID爲每個用戶。我假設你的auto_increment與消息發送的順序一致。即使它不是你想要的確切邏輯,這是一種通用技術,可以從MySQL中的分組記錄中獲取特定的值子集。

6

您不能SELECT列未在GROUP BY或其他allowed functions列出。這是how GROUP BY works

儘管大多數其他SQL風格在這樣的查詢上會失敗,但MySQL不會。相反,它提供任意結果 - 你所看到的。

你可以通過幾種不同的方式解決這個問題。例如:

  • SELECTIDS在一個單獨的查詢中使用GROUP BY最新的用戶會話的
  • 通過子選擇IDJOIN這一組ID來完成一個查詢。