[英]MySQL - Get count() for each row in a group with different condition
我有一個高分表scores: (id int, deviceid int, value int, board int)
。 我想為特定玩家展示一個位置。 目前我正在這樣做(在PHP中):
我選擇所有玩家都有得分和得分的棋盤:
select board, min(value) as value
from scores
where deviceid = 1234
group by board
然后對於每一行($ board,$ value)我選擇:
select count(id) from scores
where board = $board and value < $value
通過選擇得分低於指定值的特定棋盤的行數,我得到玩家的位置(第一個玩家獲得位置0,所以當顯示時它將增加1)
我知道這是非常低效的,所以我正在尋找一種更快的方法 。 它可以在帶有光標的存儲過程中完成,但對於100個板,我需要做最多1 + 100次選擇。
簡而言之,我想在偽sql中做這樣的事情:
select board, min(value) as val,
count(id) from _this_group_ where value < val
from scores
where deviceid = 1234
group by board
SELECT scores.board, count(1) AS position
FROM scores
JOIN
(SELECT board, MIN(value) AS value
FROM scores
WHERE deviceid = 1234
GROUP BY board
) player_scores
ON scores.board = player_scores.board
WHERE scores.value < player_scores.value
GROUP BY scores.board
您可以嘗試以下方式:
SELECT a.board, b.val COUNT(1) AS cnt
FROM scores a
INNER JOIN(
SELECT board, MIN(value) as val
FROM scores
WHERE deviceid = 1234
GROUP BY board
) b
ON a.board = b.board
AND a.value < b.val
WHERE a.deviceid = 1234
GROUP BY a.board;
要么
SELECT a.board, MIN(a.value) as val,
(SELECT COUNT(1)
FROM scores b
WHERE b.board = a.board AND
b.value < MIN(a.value)) AS cnt
FROM scores a
WHERE a.deviceid = 1234;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.