2010-01-13 3 views
0
 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 Эбен Hotel Budapest
27 Веритас
28 Ibis Budapest Heroes Square
29 Hunguest Hotel Griff
30 Hotel Thomas
31 NH Budapest
31 Rubin Wellness and Conference Hotel
32 Benczur Отель
33 Atlantic
33 Delibab Hotel Budapestстранно MySQL GROUP BY/ORDER BY поведения

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

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

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

+1

Почему вы используете 'GROUP BY', если вы не используете какие-либо агрегированные функции? –

+0

Так что я могу GROUP_CONCAT цены. Например: GROUP_CONCAT (CONCAT (транспорт, '||', цена, '||', p.url) SEPARATOR '(|)') AS цены Для простоты я пропустил GROUP_CONCAT. –

ответ

0

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

+0

Не работает. Он меняет пару строк, но не в начале. –

+0

Вы задаете вопрос о группировке по p.name. Вы имели в виду группу вместо h.name? –

+0

Имена равны. Я знаю, что это выглядит плохой дизайн. Но имена в таблице цен использовались только для того, чтобы захватить цены. –

2

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


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

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 может помочь:

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

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

+0

Чтобы быть более точным, я собираюсь добавить GROUP_CONCAT и LIMIT + OFFSET для разбивки на страницы. Для простоты я удалил ненужный код. Но в самом деле, лучше отложить проблема. –

0

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

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

0

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

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