[英]Order by max value on distinct records, without using a subquery (mysql)
我有下表:
+-----------+--------+------+--------+----------+----------+---------+-------+
| player_id | europe | asia | africa | namerica | lamerica | oceania | total |
+-----------+--------+------+--------+----------+----------+---------+-------+
| 121693 | 1076 | 70 | NULL | NULL | NULL | NULL | 1146 |
| 121693 | 416 | 70 | NULL | NULL | NULL | NULL | 486 |
| 121693 | 40 | NULL | NULL | NULL | NULL | NULL | 40 |
| 118840 | 40 | NULL | NULL | NULL | NULL | NULL | 40 |
| 121693 | 40 | 70 | NULL | NULL | NULL | NULL | 110 |
| 118840 | 40 | 490 | NULL | NULL | NULL | NULL | 530 |
| 121691 | 96 | 0 | NULL | NULL | NULL | NULL | 96 |
| 121693 | 136 | 70 | NULL | NULL | NULL | NULL | 206 |
| 118840 | 40 | NULL | NULL | NULL | NULL | NULL | 40 |
| 121691 | 96 | NULL | NULL | NULL | NULL | NULL | 96 |
+-----------+--------+------+--------+----------+----------+---------+-------+
我想得到的是這樣的:
+-----------+--------+------+--------+----------+----------+---------+-------+
| player_id | europe | asia | africa | namerica | lamerica | oceania | total |
+-----------+--------+------+--------+----------+----------+---------+-------+
| 121693 | 1076 | 70 | NULL | NULL | NULL | NULL | 1146 |
| 118840 | 40 | 490 | NULL | NULL | NULL | NULL | 530 |
| 121691 | 96 | 0 | NULL | NULL | NULL | NULL | 96 |
+-----------+--------+------+--------+----------+----------+---------+-------+
我已經嘗試了以下方法,但是結果並不是我所需要的。
SELECT player_id, europe, asia, africa, namerica,
lamerica, oceania, MAX(total) AS total
FROM tbl
WHERE total IS NOT NULL
GROUP BY player_id
ORDER BY total DESC
這是結果
+-----------+--------+------+--------+----------+----------+---------+-------+
| player_id | europe | asia | africa | namerica | lamerica | oceania | total |
+-----------+--------+------+--------+----------+----------+---------+-------+
| 121693 | 1076 | 70 | NULL | NULL | NULL | NULL | 1146 |
| 118840 | 40 | | NULL | NULL | NULL | NULL | 530 |
| 121691 | 96 | 0 | NULL | NULL | NULL | NULL | 96 |
+-----------+--------+------+--------+----------+----------+---------+-------+
請注意,我正在使用MySQL視圖。 在MySQL的觀點不允許 子查詢 。
編輯:
根據先前的建議,我已經嘗試過:
SELECT a.player_id, a.europe, a.asia, a.africa, a.lamerica, a.namerica, a.oceania, a.total
FROM tbl AS a
INNER JOIN (
SELECT player_id, MAX(total) AS total
FROM tbl
GROUP BY player_id) b
ON a.player_id = b.player_id AND a.total = b.total
但是我得到了以下結果:
+-----------+--------+------+--------+----------+----------+---------+-------+
| player_id | europe | asia | africa | lamerica | namerica | oceania | total |
+-----------+--------+------+--------+----------+----------+---------+-------+
| 121693 | 1076 | 70 | NULL | NULL | NULL | NULL | 1146 |
| 118840 | 40 | 490 | NULL | NULL | NULL | NULL | 530 |
| 121691 | 96 | NULL | NULL | NULL | NULL | NULL | 96 |
| 121691 | 96 | 0 | NULL | NULL | NULL | NULL | 96 |
+-----------+--------+------+--------+----------+----------+---------+-------+
它還返回平局。 如何避免這種情況?
將另一個GROUP BY a.player_id
添加到查詢中:
SELECT a.player_id, a.europe, a.asia, a.africa, a.lamerica, a.namerica, a.oceania, a.total
FROM tbl AS a
INNER JOIN (
SELECT player_id, MAX(total) AS total
FROM tbl
GROUP BY player_id) b
ON a.player_id = b.player_id AND a.total = b.total
GROUP BY a.player_id
這將從具有聯系的行中任意選擇其他列的內容。
如果您啟用了ONLY_FULL_GROUP_BY
SQL模式(默認情況下從MySQL 5.7開始啟用),則需要使用ANY_VALUE
表示可以。
SELECT a.player_id, ANY_VALUE(a.europe), ANY_VALUE(a.asia), ANY_VALUE(a.africa), ANY_VALUE(a.lamerica), ANY_VALUE(a.namerica), ANY_VALUE(a.oceania), ANY_VALUE(a.total)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.