MySQL查询返回意外结果

时间:2013-12-22 10:06:39

标签: php mysql

我在我的数据库上运行了一个查询,发现了一个奇怪的sql行为。返回的结果对我没有意义。我已运行此查询,返回的结果不是所需的结果。

 SELECT MAX(marks), name FROM umer WHERE city!="NewYork"

这是表格的快照。

enter image description here

我得到了这个结果:

名称MAX(标记)

eric schmidt 100

但是我应该得到

Microsoft 100

为什么会返回上述结果?

PS:查询返回city="NEWYORK"

的正确结果

此致

3 个答案:

答案 0 :(得分:2)

  SELECT marks, name
    FROM umer
   WHERE city != 'NewYork'
ORDER BY marks DESC
   LIMIT 1

您的查询无效,因为MAX(marks)表达式和name列之间没有任何关系。因此,mysql完全符合您的要求 - 它会返回marks列的最大值以及name列的某些值。

而我的查询会做什么:它会返回一行没有city 'NewYork'并且marks值最大的行。

答案 1 :(得分:2)

正如MySQL Extensions to GROUP BY所述:

  

在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中指定的非聚合列。例如,此查询在标准SQL中是非法的,因为选择列表中的name列未显示在GROUP BY中:

SELECT o.custid, c.name, MAX(o.payment)
  FROM orders AS o, customers AS c
  WHERE o.custid = c.custid
  GROUP BY o.custid;
     

要使查询合法,必须从选择列表中省略name列,或在GROUP BY子句中命名。

     

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未在ORDER BY中命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会对结果集进行排序,marks不会影响服务器选择的每个组中的值。

通常,必须使用子查询来查找SELECT * FROM umer WHERE marks = ( SELECT MAX(marks) FROM umer WHERE city != 'NewYork' ) 的最大值,然后使用它来获取最大记录的其他列:

SELECT   *
FROM     umer NATURAL JOIN (
           SELECT MAX(marks) marks
           FROM   umer
           WHERE  city != 'NewYork'
         ) t

或者,使用自我加入:

SELECT   *
FROM     umer
WHERE    city != 'NewYork'
ORDER BY marks DESC
LIMIT    1

上述两种方法都将返回具有最大标记的所有记录。如果您只想要一条这样的记录,您只需对过滤后的记录进行排序并限制结果:

{{1}}

sqlfiddle上查看。

答案 2 :(得分:-1)

在您的查询中添加ORDER BY,默认情况下ORDER BY是ASC, 检查一下

SELECT MAX(marks), name FROM umer WHERE city!='NewYork'
ORDER BY marks DESC LIMIT 1