Как заставить GROUP BY выбрать самый ранний результат? - PullRequest
1 голос
/ 06 февраля 2011

Предположим, я пытаюсь каталогизировать банки и филиалы, где у банка есть несколько филиалов через branches.bank_id. Каждый филиал имеет коэффициент удивительности branches.awesomeness.

Как мне структурировать запрос, который возвращает список банков, отсортированных по их наименее удивительной ветви?

У меня есть следующее:

SELECT * FROM `banks`
  INNER JOIN `branches` ON `branches`.`bank_id` = `banks`.`id`
  GROUP BY `banks`.`id`
  ORDER BY `branches`.`awesomeness` ASC;

Когда я пытаюсь это сделать, ветвь, информация о которой сгруппирована с любым конкретным банком, - не самая удивительная ветка (та, которая появляется раньше всего при удалении оператора GROUP BY).

Как мне это сделать?

Это предназначено для использования с Rails, поэтому, если удобнее использовать синтаксис в стиле arel или принимать во внимание специфичные для Rails требования, не стесняйтесь их вводить.

Ответы [ 3 ]

3 голосов
/ 06 февраля 2011

Я не понимаю, почему вы хотите использовать GROUP BY, если вы также хотите получить данные ветви.Удалите GROUP BY из вашего запроса и обновите сортировку следующим образом: ORDER BY branches.bank_id, branches.awesomeness

Если вы настаиваете на группировании, используйте агрегатную функцию MIN(), чтобы получить наименьший вес для каждой группы.

ORDER BY MIN(branches.awesomeness) ASC;


Обновление: если вам нужен гибрид обоих, и вы хотите сортировать банки по «наименьшему количеству» и филиалам в банке по их удивительному значению самостоятельно, используйте этот запрос:

SELECT b.*, r.*, brs.MinAw
FROM banks b
    INNER JOIN branches r ON r.bank_id = b.id
    INNER JOIN (
        SELECT bank_id, MIN(awesomeness) MinAw
        FROM branches
        GROUP BY bank_id
    ) brs ON b.id = brs.bank_id
ORDER BY brs.MinAw, r.awesomeness;
1 голос
/ 06 февраля 2011

Дополнение к ответу Scrum Meisters:

  • Синтаксис JOIN объединяет записи из родительского в дочерний, и когда дочерний элемент может иметь более одной записи, связанной с родительской записью, вы получите дубликаты.

  • DISTINCT не поможет при выборе всех столбцов из всех задействованных таблиц, потому что для удаления DISTINT должна быть продублирована вся строка. В этом примере будет разная информация о ветвях для каждой строки.

  • MySQL GROUP BY поддержка пропуска столбцов используется большинством - некоторые другие базы данных поддерживают это, поэтому он не будет работать, если вы перейдете на SQL Server, Oracle, PostgreSQL ... Другая проблема с Поддержка GROUP BY в MySQL - это значение столбца из тех, которые не определены в GROUP BY и не находятся внутри агрегатной функции, будут произвольными: чем больше набор данных, тем меньше вероятность того, что вы сможете последовательно гарантировать один и тот же вывод.

0 голосов
/ 06 февраля 2011

может быть?

select DISTINCT bank_id from branches
ORDER BY awesomeness desc; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...