1. 程式人生 > >mysql的 函式 group_concat , substring_index 的使用以及 分庫分表操作

mysql的 函式 group_concat , substring_index 的使用以及 分庫分表操作

轉載: 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