mysql的 函式 group_concat , substring_index 的使用以及 分庫分表操作
阿新 • • 發佈:2019-01-09
轉載: http://www.tuicool.com/articles/eQ3EVv
mysql中沒有類似oracle和postgreSQL的 OVER(PARTITION BY)功能. 那麼如何在MYSQL中搞定分組聚合的查詢呢
先說結論: 利用 group_concat + substr等函式處理
例如: 訂單表一張, 只保留關鍵欄位
id | user_id | money | create_time |
1 | 1 | 50 | 1420520000 |
2 | 1 | 100 | 1420520010 |
3 | 2 | 100 | 1420520020 |
4 | 2 | 200 | 1420520030 |
業務: 查詢每個使用者的最近一筆消費金額
單純使用group by user_id, 只能按user_id 將money進行聚合, 是無法將最近一單的金額篩選出來的, 只能滿足這些需求, 例如: 每個使用者的總消費金額 sum(money), 最大消費金額 max(money), 消費次數count(1) 等
但是我們有一個group_concat可以用, 思路如下:
1. 查找出符合條件的記錄, 按user_id asc, create_time desc 排序;
select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time desc
user_id | money | create_time |
1 | 100 | 1420520010 |
1 | 50 | 1420520000 |
2 | 200 | 1420520030 |
2 | 100 | 1420520020 |
2. 將(1)中記錄按user_id分組, group_concat(money);
select t.user_id, group_concat( t.money ) moneys from (select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time desc) t group by user_id
user_id | moneys |
1 | 100,50 |
2 | 200,100 |
3. 這時, 如果使用者有多個消費記錄, 就會按照時間順序排列好, 再利用 subString_index 函式進行切分即可
完整SQL:
select t.user_id, substring_index(group_concat( t.money ),',',1) lastest_money from (select ord.user_id, ord.money, ord.create_time from orders ord where ord.user_id > 0 and create_time > 0 order by user_id asc , create_time desc) t group by user_id ;
user_id | moneys |
1 | 100 |
2 | 200 |
利用這個方案, 以下類似業務需求都可以這麼做, 如:
1. 查詢每個使用者過去10個的登陸IP
2. 查詢每個班級中總分最高的兩個人
----------- 分割線 ------- :分庫分表操作 :
見 該文章 :mysql資料庫的
http://www.jb51.net/article/36272.htm