SELECT s1.*
FROM score s1 LEFT OUTER JOIN score s2
ON (s1.game_id = s2.game_id AND s1.thescore < s2.thescore)
GROUP BY s1.score_id
HAVING COUNT(*) < 3;
Этот запрос возвращает строки для всех выигрышных игр. Хотя галстуки включены; если счет 10,16,16,16,18, то четыре победителя: 16,16,16,18. Я не уверен, как вы справляетесь с этим. Вам нужен какой-то способ разрешения связей в условии соединения.
Например, если связи разрешены победой в более ранней игре, вы можете изменить запрос следующим образом:
SELECT s1.*
FROM score s1 LEFT OUTER JOIN score s2
ON (s1.game_id = s2.game_id AND (s1.thescore < s2.thescore
OR s1.thescore = s2.thescore AND s1.score_id < s2.score_id))
GROUP BY s1.score_id
HAVING COUNT(*) < 3;
Вы также можете использовать столбец timestamp
для разрешения связей, если вы можете полагаться на то, что UNIQUE
.
Однако MySQL в любом случае стремится создать временную таблицу для этого типа запроса. Вот вывод EXPLAIN
для этого запроса:
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | SIMPLE | s1 | ALL | NULL | NULL | NULL | NULL | 9 | Using temporary; Using filesort |
| 1 | SIMPLE | s2 | ALL | PRIMARY | NULL | NULL | NULL | 9 | |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+