關于MySQL group by的問題
問題描述
表字段及數據:idamountuser_idcreate_time110012016-10-11 10:59:332300022016-10-10 10:59:543325612016-10-09 11:00:164154612016-10-08 11:00:38我想取每個user的第一條記錄,SQL:select * from test group by user_id.
結果:idamountuser_idcreate_time110012016-10-11 10:59:332300022016-10-10 10:59:54然后我發現如果根據時間來排序,無論是順序還是逆序他都是這個結果,然后我猜想這個結果是不是根據id的大小來的,結果我改了id也是一樣,然后我猜想group by 結果是根據記錄添加順序來決定的,當group by的字段出現重復時,只會取第一條記錄,不知道這樣對不對,求解答?
問題解答
回答1:不加create_time也一樣只是因為你的記錄中的順序已經是規律的了,什么排序也沒有的前提下,其實group by以后取出只是所有記錄中user_id第一次出現的記錄
回答2:你所謂的“第一條記錄”是按照什么順序的“第一”呢?數據庫的表本身并不預設某種順序。假設你是要按照id排序且id無重復:
select * from test where id in (select min(id) from test group by user_id);
應該可以達到目的。
回答3:group by是按主鍵順序展示的結果。要展示最新的amount需要在在組內排序。
selet * from( select id,amount,user_id,create_time from test order by create_time desc) as t group by user_id回答4:
這樣理解可以說錯, 也可以說對.
說錯是因為 按sql標準, 如果sql里面有分組, 只有分組列才是有效的數據.select * from test group by user_id. 這行表示, 只有user_id這一列才是真數據, 別的列是假的, 即使選出來, 也不能用.
但是對于MySql, 他的行為就和你描述的一樣.
相關文章:
1. Docker for Mac 創建的dnsmasq容器連不上/不工作的問題2. javascript - (_a = [""], _a.raw = [""],....); js一個小括號的是什么意思?3. javascript - 關于微信掃一掃的技術問題4. html - Python2 BeautifulSoup 提取網頁中的表格數據及連接5. javascript - 關于js高級程序中的問題6. html5 - 請問利用font-face定義的字體怎么在canvas里應用?7. 小白學python的問題 關于%d和%s的區別8. html5 - css 這種六邊形的邊框怎么畫?9. javascript - vuex中子組件無法調用公共狀態10. javascript - js正則替換日期格式問題
