有表如下,要找到 family_name 為 green 和 smith 的身高最高的兩個人的 given_name。
+----+-------------+------------+--------+|id
| family_name | given_name | height |
+----+-------------+------------+--------+
| 1 | smith | mike | 157 |
| 2 | smith | ashlin | 165 |
| 3 | smith | eason | 181 |
| 4 | smith | kaley | 175 |
| 5 | green | jack | 164 |
| 6 | green | kate | 179 |
| 7 | green | kathryn | 168 |
| 8 | green | waller | 187 |
| 9 | brown | mary | 178 |
| 10 | brown | lana | 173 |
| 11 | brown | lange | 175 |
| 12 | brown | randy | 177 |
+----+-------------+------------+--------+
在子查詢裡先按身高排序,再在外面用 family_name 分組:
select given_name from
(select
*from height
where family_name in
('green'
,'smith'
)order
by height desc
) b
group
by family_name;
結果外層的分組並未按照子查詢內的順序進行。
+
------------+
| given_name |
+------------+
| jack |
| mike |
+------------+
查詢效果和直接查結果一樣。
select given_name from height
where family_name in
('green'
,'smith'
)group
by family_name
order
by height desc
兩句 sql explain 的結果也一樣。
idselect_type
table
partitions
type
possible_keys
keykey_len
refrows
filtered
extra
1******
height
null
allnull
null
null
null
1220.00
using where; using temporary; using filesort
但是在上述的子查詢 sql 中使用 group by,就能達到預期結果。
select given_name from
(select
*from height
where family_name in
('green'
,'smith'
)group
by id
order
by height desc
) b
group
by family_name;
+------------+
| given_name |
+------------+
| waller |
| eason |
+------------+
再看 該語句的 explain:
idselect_type
table
partitions
type
possible_keys
keykey_len
refrows
filtered
extra
1primary
null
allnull
null
null
null
2100.00
using temporary; using filesort
2derived
height
null
allprimary
null
null
null
1220.00
using where; using filesort
mysql 5.7 版本對子查詢進行了優化,子查詢會被改為聯結查詢的形式以節省時間和資源,除非子查詢內包含union 、group by、distinct、limit 或使用了聚合函式。
具體原因檢視
mysql 先排序再分組的sql語句實現
最近專案中有乙個需求,需要先分組,再排序的功能。搞了好久,經過敏大大 後台兄弟 指導,終於搞出來了,分享給大家 demo 學生資訊表 第一時間想到 sql select from t test group by name,type order by score desc 結果 發現,並不能滿足我們需...
mysql如何實現先排序再分組,獲取第乙個元素
下面說個簡單列子 需求 查詢出每個班級人數,以及各班年齡最大的那一位 現在有一張student表如下 這個sql用到了substring index str,delim,count group concat expr 1 group concat expr 意思是 拼接expr,以 連線,可以使用這...
MySql下實現先排序後分組
最近在工作中遇到乙個先排序後分組的需求,發現mysql不同的版本有不同的結果,特此記錄。舉例 要求在shop表中查詢出各型別商店中 最高的商品。表結構 create table shop id int 10 primary key,shop name varchar 100 item name va...