Странное поведение MySQL GROUP BY / ORDER BY - PullRequest
0 голосов
/ 13 января 2010
        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 Hotel
33 Атлантика
33 Delibab Hotel Budapest

Точно такой же результат с закомментированной GROUP BY:
24 Геранд Отель Вентура
25 Hunguest Hotel Platanus
Гостевой дом City Boulevard 26
26 Tulip Inn Millennium Budapest
26 Eben Hotel Budapest
27 Veritas
27 бароссов
28 Отель Томас
28 Hunguest Hotel Griff
28 Ibis Budapest Heroes Square

В основном я хотел бы группировать по имени, но оставляю ORDER BY. Поскольку 24 меньше, чем 26, я ожидаю, что он появится раньше, чем 26. Также имейте в виду, я показываю только первые 10 результатов, чтобы держать пост коротким.

Я использую: SELECT VERSION () -> 5.1.37

Ответы [ 4 ]

2 голосов
/ 13 января 2010

Вы используете group by на p.name, но выбираете это поле и другое; и почему вы используете group by здесь? Это действительно необходимо?


Цитирование страницы SELECT руководства MySQL:

MySQL расширяет использование GROUP BY для разрешить выбор полей, которые не являются упоминается в предложении GROUP BY. Если вы не получаете результаты, которые вы ожидаете от вашего запроса, пожалуйста прочитайте описание найденной GROUP BY в разделе 11.12, «Функции и Модификаторы для использования с GROUP BY Морозы».


И чтение 11.12.3. GROUP BY и HAVING со скрытыми столбцами может помочь:

При использовании этой функции все строки в каждая группа должна иметь одинаковые значения для столбцов, которые опущены из GROUP BY часть. Сервер бесплатный вернуть любое значение из группы, так результаты являются неопределенными, если все значения одинаковы.

В принципе, добавление агрегатной функции в столбец p.price может где-то помочь, я бы сказал.

0 голосов
/ 13 января 2010

В случае, если кто-то еще может бороться из-за этого:

Добавьте SELECT MIN(p.price) AS price, а затем ORDER BY price. Это даст вам желаемый результат.

0 голосов
/ 13 января 2010

Предложение Group By в основном используется, когда вам нужен результат с некоторыми агрегатными функциями, такими как (сумма, среднее и т. Д.)

Другое дело, что вам нужно выбрать столбец в наборе результатов, по которому вы хотите группировать.

0 голосов
/ 13 января 2010

Добавить HAVING MIN(p.price).

...