1

我试图从一个名为 games 的表中选择前 3 个条目,该表具有玩家的外键和 2 个用于主机和对手的个人分数的整数。

查询:

SELECT 
   games.id, games.host_score, games.opponent_score, player.name 
FROM games, player 
WHERE player.id = games.host_player_id 
      || player.id = games.opponent_player_id 
ORDER BY games.host_score, games.opponent_score DESC LIMIT 3

查询完成,但又出现乱序:

id  host_score  opponent_score  name
17  0           0               Temp2
17  0           0               Temp0
16  770         930             Temp0

当我运行没有 OR 的查询时,它可以工作。我怎样才能使这种方法起作用?

还有一种方法可以将 LIMIT 设置为 50 但不计算重复项?例如,如果我想要 2 的限制,但 3 人的得分为 50,而 2 人的得分为 20,它将返回:

id  host_score  opponent_score  name
17  50          0               Temp2
17  50          0               Temp0
17  50          0               Temp1
17  20          0               Temp3
17  20          0               Temp4

或者在php中将它作为单独的问题运行会更好吗?

4

3 回答 3

0

我认为您的查询是错误的,因为一场比赛将分两排进行——一场给东道主,一场给对手。

您想同时获取主机名和对手名,因此您需要加入两次player表:

SELECT g.id, g.host_score, g.opponent_score, hp.name as HostName, op.name as OpponentName
FROM games g join
     player hp
     on hp.id = g.host_player_id join
     player op
     on op.id = g.opponent_player_id 
ORDER BY g.host_score, g.opponent_score DESC
LIMIT 3
于 2013-01-16T19:08:48.993 回答
0

如果要从最高到最低排序,则需要为每个字段指定它

ORDER BY games.host_score DESC, games.opponent_score DESC 

因为当您不指定顺序时,它假定您想要升序

于 2013-01-16T17:39:54.820 回答
0

您应该在 SQL 中使用 OR(而不是 ||),还应添加括号以使其可读。

WHERE (player.id = games.host_player_id) OR (player.id = games.opponent_player_id) 

通过分数值获得前 50 位分数,尽管返回的总行数可能更高。使用下面的准系统查询并根据您的需要进行调整。

SELECT g1.id, g1.host_scores, COUNT(g2.host_scores) AS Rank
FROM games g1
WHERE Rank <= 50
JOIN games g2 ON (g1.host_scores < g2.host_scores) OR (g1.host_scores=g2.host_scores) 
GROUP BY g1.id, g1.host_scores
ORDER BY g1.host_scores DESC;

我必须补充一点,为了避免复杂性,您还可以将数据获取到您的应用程序中,并使用 Java、PHP 等编程语言轻松完成此操作。这可能会导致您进行多个查询,但更简单和更多随着时间的推移可维护。

于 2013-01-16T17:46:19.357 回答