2015-09-25 30 views
1

我正在制作一个程序,根据谁拥有两个属性分数的最高总和来自动建议选择哪个玩家,例如,保存的目标得分为&。因此我有一个表(播放器),看起来是这样的:如何返回两列总和最高的行?

+---------------+--------------+-------------+ 
|  Name  | GoalsScored | GoalsSaved | 
+---------------+--------------+-------------+ 
| John Smith |   15 |   12 | 
| John Doe  |   12 |   20 | 
| Bob John  |   7 |   6 | 
| John Bob  |   10 |   30 | 
| Bobby Johnson |   25 |   30 | 
+---------------+--------------+-------------+ 

和临时表来存储已经选择的球员(taken_players)的名字,这看起来是这样的:

+-----------------+ 
| takenplayername | 
+-----------------+ 
| Bob John  | 
| Bobby Johnson | 
+-----------------+ 

我正在寻找返回GoalsScored + GoalsSaved最高的玩家的名字的SQL查询,只要玩家没有被列出在玩家表中。

SELECT * FROM players 
LEFT JOIN taken_players ON players.Name = taken_players.takenplayername 
WHERE taken_players.takenplayername IS NULL 
    AND GoalsScored, GoalsSaved in (
     SELECT MAX(GoalsScored + GoalsSaved) 
     FROM players 
) 

到目前为止,我有上面的代码,只有部分工作。我遇到的问题是,该声明的

GoalsScored, GoalsSaved in (SELECT MAX(GoalsScored + GoalsSaved) 

部分没有做什么,我需要它,我在这里的一些代码只是猜测来说明我想它在做什么这个问题的目的。

另一个问题是,如果最佳玩家被添加到采取的玩家列表中,查询将返回任何内容而不是下一个最佳玩家。

我对此很新,任何帮助将不胜感激。

+0

请用您正在使用的数据库标记您的问题。 –

回答

0

你想order by和东西限制在一个行:

SELECT p.* 
FROM players p LEFT JOIN 
    taken_players tp 
    ON p.Name = tp.takenplayername 
WHERE tp.takenplayername IS NULL 
ORDER BY (GoalsScored + GoalsSaved) DESC 
LIMIT 1; 

LIMIT 1可以根据数据库的几个其他的事情:

  • SELECT TOP 1
  • WHERE rownum = 1
  • FETCH FIRST 1 ROW ONLY
+0

如果两个玩家并列最高分,该怎么办? –

+0

@devlincarnate。 。 。然后其中一人将被退回。问题具体是单数:“[返回] GoalsScored + GoalsSaved最高的球员的名字”,所以你的问题更适合于OP。 –

+0

明白了,但也许OP没有考虑过平局的情况,并且很好地澄清逻辑中的潜在问题,不是吗? –

0

问题在于你的WHERE子句。它会选择最大总和,但不会绑定到特定的玩家。解决此问题的方法:

SELECT p.* FROM players p 
LEFT JOIN taken_players t ON p.Name = t.takenplayername 
WHERE t.takenplayername IS NULL 
AND (p.GoalsScored + p.GoalsSaved) = (SELECT MAX(GoalsScored + GoalsSaved) as MaxScore FROM players) 

注:此查询将返回一个以上的记录,在情况下,当一个以上的球员有得分最高(在平局的情况下)

0
SELECT * from players p where p.id not in (SELECT id from taken_players) and (p.GoalsScored + p.GoalsSaved) = (SELECT MAX(GoalsScored + GoalsSaved) as MaxScore FROM players) 

类似到上面的答案,因为它可能会给你多个玩家。获取一个玩家的语法会因DBMS而异,但这应该在大多数情况下起作用。

SELECT * FROM Players where id = (SELECT MIN(id) from players where players.id NOT in (SELECT id from taken_players) and players.GoalsScored+ players.GoalsSaved = (SELECT MAX(players.GoalsScored+ players.GoalsSaved from players where players.id not in (SELECT id from taken_players))