P粉3402642832023-08-22 19:25:52
在其他資料庫中,您可以使用ROW_NUMBER
來實現此功能。 MySQL不支援ROW_NUMBER
,但您可以使用變數來模擬它:
SELECT person, groupname, age FROM ( SELECT person, groupname, age, @rn := IF(@prev = groupname, @rn + 1, 1) AS rn, @prev := groupname FROM mytable JOIN (SELECT @prev := NULL, @rn := 0) AS vars ORDER BY groupname, age DESC, person ) AS T1 WHERE rn <= 2
線上示範: sqlfiddle
#編輯 我剛剛注意到bluefeet發布了一個非常相似的答案:給他 1。但是這個答案有兩個小優點:
因此,我將保留它,以防它能幫助某人。
P粉4045397322023-08-22 13:19:02
以下是一種方法,使用UNION ALL
(請參閱帶有示範的SQL Fiddle)。這適用於兩個群組,如果你有多個群組,則需要指定group
編號並為每個group
新增查詢:
( select * from mytable where `group` = 1 order by age desc LIMIT 2 ) UNION ALL ( select * from mytable where `group` = 2 order by age desc LIMIT 2 )
有多種方法可以實現這個目標,請參考本文以確定適合您情況的最佳方法:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
編輯:
這也可能適用於您,它為每筆記錄產生一個行號。使用上面連結中的範例,它將只傳回行號小於或等於2的記錄:
select person, `group`, age from ( select person, `group`, age, (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number from test t CROSS JOIN (select @num:=0, @group:=null) c order by `Group`, Age desc, person ) as x where x.row_number <= 2;
請參考演示
#