需求
有兩個(gè)表:游戲表骗卜、視頻表,一個(gè)游戲?qū)?yīng)多個(gè)視頻,取出排在最前面的 5 個(gè)游戲的視頻(每個(gè)游戲只選取他所有視頻的第一個(gè))咏尝,視頻排序按照視頻表的順序(Video.level)
最終解決方法:
SELECT * FROM `tbl_video` AS `Video` LEFT OUTER JOIN `tbl_game` AS `Game`
ON `Video`.`gameId` = `Game`.`id`
WHERE `Video`.`level` in (SELECT MAX(`level`) FROM `tbl_video` GROUP BY `gameId`) AND `Video`.`isShow` = 1
ORDER BY `Video`.`level` DESC LIMIT 0, 5
網(wǎng)上盛傳的子查詢解決方案貌似是錯(cuò)誤的
數(shù)據(jù)庫 test:
id | name | gameId | level |
---|---|---|---|
1 | a | 1 | 1 |
2 | b | 2 | 2 |
3 | c | 1 | 3 |
4 | d | 1 | 4 |
5 | e | 2 | 5 |
運(yùn)行子查詢語句
select * from (select * from `test` order by `level` desc) `temp` group by `gameId` order by `level` desc
得到
id | name | gameId | level |
---|---|---|---|
2 | b | 2 | 2 |
1 | a | 1 | 1 |
group by 只是每組取一個(gè)代表值溉奕,目測(cè)沒有什么規(guī)律(待驗(yàn)證)
解決方法
select * from `test` where `level` in (
SELECT substring_index(group_concat(`level` order by `level` desc SEPARATOR ','),",",1) from `test` GROUP BY `gameId`
) order by `level` desc;
這個(gè)比較靈活褂傀,可以在 group by 后,再按結(jié)果集里的再進(jìn)行自己想要的字段排序等加勤。
這個(gè)可以自由實(shí)現(xiàn)獲取分組后仙辟,第 N 大的數(shù)據(jù)。比如鳄梅,分組后叠国,第 N 大的數(shù)據(jù):
select * from `test` where `level` in (
SELECT substring_index(substring_index(group_concat(`level` order by `level` desc SEPARATOR ','),",",N), ",",-1)
from `test` GROUP BY `gameId`
) order by `level` desc;
將 N 改為你自己想要的數(shù)字即可(但是超過數(shù)量以后會(huì)求最末尾的那一個(gè)),而最上面的方法只能求最大最小戴尸。