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 | |
+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+