程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql中count(), group by, order by使用詳解

mysql中count(), group by, order by使用詳解

編輯:MySQL綜合教程

mysql中count(), group by, order by使用詳解。本站提示廣大學習愛好者:(mysql中count(), group by, order by使用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql中count(), group by, order by使用詳解正文


mysql中count(), group by, order by使用詳解

作者:linux_c_coding_man

mysql中order by 排序查詢、asc升序、desc降序,group by 分組查詢、having 只能用於group by子句、作用於組內,having條件子句可以直接跟函數表達式。使用group by 子句的查詢語句需要使用聚合函數。

最近做IM的時候遇到一個問題,同時用到了這三個關鍵字。就是查詢一個人的離線消息詳情,我們服務端返回給客戶端顯示的這個詳情包括了三個內容,第一個要求列出離線這段時間哪些人或者群給你發了消息,第二個這其中的某個人或者群發了多少條離線消息,第三個拿出最新的一條顯示出來。很明顯,group by分組哪些人或者群給你發了離線消息,count()得到離線消息數量,order by時間來排序拿出最新的消息。

select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc group by from_company_id, from_user_id;

然後果不其然group by和order by一起檢索就報錯了,我們可以用嵌套子查詢。

select count(1) as cnt, msg_data from (select * from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc) as temp_table group by from_company_id, from_user_id;

我們可以對已經排序的結果集,再來分組並計算數量。這裡還有一個暗坑,我自己不小心給躲過去了,其實count()會造成order by排序無效,舉個例子:

select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc;

這個語句最後得到的一條記錄,其中的msg_data其實是根本沒有排序的結果,也就是數據庫原順序,應該是先插入的一條消息,就是說時間舊的消息。為了避免這個問題,所以嵌套子查詢在這裡先排序,再讓它去count()就規避了。自己無意躲過去了,還好反復改語句測試了一番才發現。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved