mysql子查詢先排序再分組的問題

2021-10-04 03:32:41 字數 2883 閱讀 4455

有表如下,要找到 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...