关于MySQL group by的问题
ringa_lee
ringa_lee 2017-04-17 15:44:15
0
4
716
表字段及数据:
id amount user_id create_time
1 100 1 2016-10-11 10:59:33
2 3000 2 2016-10-10 10:59:54
3 3256 1 2016-10-09 11:00:16
4 1546 1 2016-10-08 11:00:38

我想取每个user的第一条记录,
SQL:select * from test group by user_id.

结果:
id amount user_id create_time
1 100 1 2016-10-11 10:59:33
2 3000 2 2016-10-10 10:59:54

然后我发现如果根据时间来排序,无论是顺序还是逆序他都是这个结果,然后我猜想这个结果是不是根据id的大小来的,结果我改了id也是一样,然后我猜想group by 结果是根据记录添加顺序来决定的,当group by的字段出现重复时,只会取第一条记录,不知道这样对不对,求解答?

ringa_lee
ringa_lee

ringa_lee

全部回覆(4)
阿神

不加create_time也一樣只是因為你的記錄中的順序已經是規律的了,什麼排序也沒有的前提下,其實group by以後取出只是所有記錄中user_id第一次出現的記錄

阿神

你所謂的「第一筆記錄」是按照什麼順序的「第一」呢?資料庫的表本身並不會預設某種順序。假設你是要按照id排序且id無重複:

select * from test where id in (select min(id) from test group by user_id);

應該可以達到目的。

大家讲道理

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
洪涛

這樣理解可以說錯, 也可以說對.

  1. 說錯是因為按sql標準, 如果sql裡面有分組, 只有分組列才是有效的資料.
    select * from test group by user_id. 這行表示, 只有user_id這一列才是真資料, 別的列是假的, 即使選出來, 也不能用.

  2. 但是對於MySql, 他的行為就和你描述的一樣.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板