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