MySQL查询排序高分

时间:2013-01-16 17:37:13

标签: php mysql mysqli

我正在尝试从一个名为游戏的桌子中选择前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中单独运行它会更好吗?

3 个答案:

答案 0 :(得分:0)

如果您想从最高到最低订购,则需要为每个字段指定

ORDER BY games.host_score DESC, games.opponent_score DESC 

因为当你没有指定顺序时,它假定你想要升序

答案 1 :(得分: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等编程语言轻松完成此操作。 它可能会导致您进行多个查询,但更简单,更简单 随着时间的推移可维持

答案 2 :(得分: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