使用view和group by时,mysql返回不同的结果

时间:2015-09-04 18:03:27

标签: mysql

在mysql中使用view和group by时得到错误的结果。

一个简单的表test

id  name value
1   a   200
2   a   100
3   b   150
4   b   NULL
5   c   120

使用普通语法

select * from (select * from test order by name asc, value asc ) as test group by test.name;

它返回

id  name value
2   a   100
4   b   NULL
5   c   120

但是,如果将子查询替换为视图, 它显示了不同的结果。

create view test_view as select * from test order by name asc, value asc;

select * from test_view as test group by test.name;

它返回

id  name value
1   a   200
3   b   150
5   c   120
它真的困扰我,请有人给我一些提示。感谢。

1 个答案:

答案 0 :(得分:0)

之前对它进行分组,然后对结果进行排序,尝试这个,更简单的相同结果:

select * from test group by name order by name asc, value asc

如果你真的需要制作一个子查询,它是相同的,第一组是:

select * from (select * from test group by name) as test order by test.name asc, test.value asc

http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html

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

没有任何迹象表明您的子查询技巧应该有所作为,并确保您希望的确定性结果。