У меня проблема, когда код ниже показывает общий балл всех введенных забитых для членов, а не ограничивает их лучшим 2. Кажется, что не нравится дублировать баллы и не добавляет их в некоторых членов, имеет менее 2 баллов, показывающих, когда у них более 2 баллов.
create table members(id int, name char, handicap int);
insert into members(id, name, handicap)
values(1, 'Bob', 12);
insert into members(id, name, handicap)
values(2, 'John', 14);
create table results(member_id int, course_id int, score int, position int);
insert into results(member_id int, course_id int, score int, position int)
values(1,1,36,1);
insert into results(member_id int, course_id int, score int, position int)
values(1,2,34,2);
insert into results(member_id int, course_id int, score int, position int)
values(2,1,27,2);
insert into results(member_id int, course_id int, score int, position int)
values(2,2,35,2);
insert into results(member_id int, course_id int, score int, position int)
values(2,3,35,2);
insert into results(member_id int, course_id int, score int, position int)
values(1,3,38,1);
И данные GET
SELECT name, handicap, best, total FROM
(SELECT name, id, curr_handicap as handicap, GROUP_CONCAT(score order by score DESC SEPARATOR ' | ') as best,
sum(score) as total
FROM members m join (SELECT member_id, score, course_id
FROM results m
WHERE(
SELECT COUNT(*)
FROM results mT
WHERE mT.member_id = m.member_id and mT.score >= m.score) <= 2 ) r
on m.id = r.member_id
group by member_id
ORDER BY total, member_id DESC, name, MIN(course_id) ASC
) AS T1
group by name
order by total DESC
Я хочу, чтобы желаемый результат выглядел так:
<table>
<tr><td>Name</td><td>Handicap</td><td>Total score</td><td>Best 2 scores</td>
</tr>
<tr><td>Bob</td><td>12</td><td>74</td><td>38 | 36</td></tr>
<tr><td>John</td><td>14</td><td>70</td><td>35 | 35</td></tr>
</table>
Однако я получаю только общий балл от всех очков игроков, а лучшие 2 балла не всегда показывают, совпадают ли они.
Если кто-то заинтересован или застрял в чем-то подобном. Мне нужно было отобразить лучшие 6 баллов для каждого участника в этой таблице. Я хотел, чтобы общий балл от лучших 6 баллов, а не только общий общий балл для этого участника.
Решение ниже, используя переменные, было намного проще, чем я думал!
SELECT name, handicap, best, total FROM
(SELECT name, id, curr_handicap as handicap, GROUP_CONCAT(score order by score DESC
SEPARATOR ' | ') as best,
sum(score) as total
FROM members m join (select member_id, score, course_id, result_id
from
(
SELECT member_id, score, course_id, result_id,
(@row:=if(@prev=member_id, @row +1, if(@prev:= member_id, 1, 1))) rn
FROM results t
CROSS JOIN (select @row:=0, @prev:=null) c
order by member_id, score desc
) src
where rn <= 6
order by member_id, score) r
on m.id = r.member_id
group by member_id
ORDER BY total, member_id DESC
) AS T1
group by name
order by total DESC");