奇怪的MySQL GROUP BY / ORDER BY行为

时间:2010-01-13 05:36:11

标签: mysql group-by sql-order-by

        SELECT
            p.price,
            h.name AS hotel_name
        FROM
            prices p
            LEFT JOIN hotels h ON p.hotel_id = h.id
        WHERE
            p.city = 'boedapest'
            AND p.hotel_id IS NOT NULL
        GROUP BY p.name     
        ORDER BY p.price ASC

结果:
26 Eben Hotel Budapest 27 Veritas
28 Ibis Budapest Heroes Square
29 Hunguest Hotel Griff 托马斯30号酒店 31 NH Budapest 31鲁宾健康和会议酒店
32 Benczur酒店
33大西洋
33 Delibab Hotel Budapest

与GROUP BY完全相同的结果注释掉:
24 Gerand Hotel Ventura
25 Hunguest Hotel Platanus
26 Boulevard City Guesthouse
26 Tulip Inn Millennium Budapest 26 Eben Hotel Budapest 27 Veritas
27巴罗斯 28托马斯酒店 28 Hunguest Hotel Griff 28 Ibis Budapest Heroes Square

基本上我想按名称进行GROUP,但保留ORDER BY。由于24小于26,我有点期望它早于26出现。另外请记住,我只显示前10个结果,以保持帖子简短。

我正在使用:SELECT VERSION() - > 5.1.37

4 个答案:

答案 0 :(得分:2)

您在group by上使用p.name,但选择该字段和另一个字段;你为什么在这里使用group by?真的有必要吗?


引用MySQL手册的SELECT页面:

  

MySQL将GROUP BY的使用扩展到   允许选择不是的字段   在GROUP BY子句中提到。如果   你没有得到结果   请期待您的查询   阅读找到的GROUP BY的描述   在11.12, “Functions and Modifiers for Use with GROUP BY Clauses”.部分


阅读11.12.3. GROUP BY and HAVING with Hidden Columns可能有所帮助:

  

使用此功能时,所有行都在   每个组应具有相同的值   对于从中省略的列   GROUP BY部分。服务器是免费的   从组中返回任何值,所以   结果是不确定的,除非   所有的价值都是一样的。

基本上,在p.price列的某处添加聚合函数可能会有所帮助,我会说。

答案 1 :(得分:0)

添加HAVING MIN(p.price)

答案 2 :(得分:0)

Group By子句主要用于需要带有一些聚合函数的结果,如(sum,avg等)

另一件事是您需要在结果集中选择要分组的列。

答案 3 :(得分:0)

如果其他人可能会为此而挣扎:

添加SELECT MIN(p.price) AS price,然后ORDER BY price。这将为您提供所需的结果。