關(guān)于MySQL group by的問題
問題描述
表字段及數(shù)據(jù):idamountuser_idcreate_time110012016-10-11 10:59:332300022016-10-10 10:59:543325612016-10-09 11:00:164154612016-10-08 11:00:38我想取每個(gè)user的第一條記錄,SQL:select * from test group by user_id.
結(jié)果:idamountuser_idcreate_time110012016-10-11 10:59:332300022016-10-10 10:59:54然后我發(fā)現(xiàn)如果根據(jù)時(shí)間來排序,無論是順序還是逆序他都是這個(gè)結(jié)果,然后我猜想這個(gè)結(jié)果是不是根據(jù)id的大小來的,結(jié)果我改了id也是一樣,然后我猜想group by 結(jié)果是根據(jù)記錄添加順序來決定的,當(dāng)group by的字段出現(xiàn)重復(fù)時(shí),只會取第一條記錄,不知道這樣對不對,求解答?
問題解答
回答1:不加create_time也一樣只是因?yàn)槟愕挠涗浿械捻樞蛞呀?jīng)是規(guī)律的了,什么排序也沒有的前提下,其實(shí)group by以后取出只是所有記錄中user_id第一次出現(xiàn)的記錄
回答2:你所謂的“第一條記錄”是按照什么順序的“第一”呢?數(shù)據(jù)庫的表本身并不預(yù)設(shè)某種順序。假設(shè)你是要按照id排序且id無重復(fù):
select * from test where id in (select min(id) from test group by user_id);
應(yīng)該可以達(dá)到目的。
回答3:group by是按主鍵順序展示的結(jié)果。要展示最新的amount需要在在組內(nèi)排序。
selet * from( select id,amount,user_id,create_time from test order by create_time desc) as t group by user_id回答4:
這樣理解可以說錯(cuò), 也可以說對.
說錯(cuò)是因?yàn)?按sql標(biāo)準(zhǔn), 如果sql里面有分組, 只有分組列才是有效的數(shù)據(jù).select * from test group by user_id. 這行表示, 只有user_id這一列才是真數(shù)據(jù), 別的列是假的, 即使選出來, 也不能用.
但是對于MySql, 他的行為就和你描述的一樣.
相關(guān)文章:
1. node.js - nodejs+express+vue2. python - 如何把152753這個(gè)字符串轉(zhuǎn)變成時(shí)間格式15:27:533. python對8000行csv添加列4. javascript - onclick事件點(diǎn)擊不起作用5. python 字符串匹配問題6. DADB.class.php文件的代碼怎么寫7. 使用mysql命令行連接遠(yuǎn)程數(shù)據(jù)庫host跳轉(zhuǎn)8. javascript - 如何獲取未來元素的父元素在頁面中所有相同元素中是第幾個(gè)?9. javascript - 我的站點(diǎn)貌似被別人克隆了, google 搜索特定文章,除了域名不一樣,其他的都一樣,如何解決?10. 數(shù)據(jù)庫 - Mysql的存儲過程真的是個(gè)坑!求助下面的存儲過程哪里錯(cuò)啦,實(shí)在是找不到哪里的問題了。

網(wǎng)公網(wǎng)安備