2014-05-24 129 views
0

我有一个数据库,看起来像SQL语句MAX返回错误的列

Year  Name  TR  AST 
1  Player 1 10  3 
2  Player 1 23  "-" 
3  Player 1 35  5 
1  Player 2 32  1 
2  Player 2 29  "-" 
3  Player 2 50  2 
1  Player 3 74  3 
2  Player 3 23  1 
3  Player 3 93  9 

我试图返回球员名称和MAX TR量。所以在这种情况下,玩家3将拥有93 TR。

我使用这个SQL查询SQLITE

SELECT MAX(TR), name 
FROM database 
WHERE TR != "-" 

它返回正确的MAX(TR)内,但它给了错误的玩家名称。

93 Player 1 

我运行了其他查询,如MAX(AST),它也给出了错误的播放器名称。无论我使用哪个MAX查询,哪个问题出在哪里,都会返回相同的玩家名称。

我也试过这种试图按照SQL的执行顺序从这里http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm

FROM database 
WHERE TR != "-" 
SELECT MAX(TR), name 

除了

SELECT name, MAX(TR) 
FROM database 
GROUP BY name 
LIMIT 1 

,并返回错误的TR但正确的对应名称为那TR。

如果它是一个问题,我不得不使用

WHERE TR != "_" 

否则它会返回一个球员的名字和TR“ - ”。我不确定这是为什么。

查询语句的顺序有问题吗?

+1

我真的很惊讶,查询在所有工作。通常,如果您一起使用列和聚合函数,则需要使用group by。 – pscuderi

回答

1

得到你想要的东西,最简单的方法是使用order bylimit

SELECT name, TR 
FROM database 
WHERE TR <> '-' 
ORDER BY TR DESC 
LIMIT 1; 

你甚至都不需要max()

+0

谢谢。我删除了以前的评论,因为我明白为什么Max()在这里不起作用。 –

0

我会用一个子查询,大概是这样的:

SELECT 
    name, 
    TR 
FROM 
    database 
WHERE 
    TR IN (
     SELECT 
      MAX(TR) 
     FROM 
      database 
     WHERE 
      TR != "-" 
    ) 

注意,这可以给你多结果时,有多个玩家在同一TR,这也是最大TR。

0

MAX是SQL中的一个聚合函数。你不能在SELECT语句中使用聚合函数和非聚合元素,比如你的情况中的列。

而不是做那些尝试这种解决方案:

SELECT name, TR 
FROM database 
WHERE TR = (
    SELECT MAX(TR) 
    FROM database 
    WHERE TR != "-" 
)