Как отсортировать порядок LEFT JOIN в запросе SQL? - PullRequest
39 голосов
/ 18 марта 2011

ОК. Я попытался найти ответ, похожий на сумасшедший, но не смог решить эту проблему, поэтому я надеюсь, что кто-нибудь сможет помочь.

Допустим, у меня есть таблица пользователей, очень простая таблица:

id | userName
3    Michael
4    Mike
5    George

и у меня есть еще одна таблица с их автомобилями и ценами.

id | belongsToUser | carPrice
1    4               5000
2    4               6000
3    4               8000

Теперь мне нужно что-то вроде этого (не стесняйтесь переписать):

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'

Что возвращает:

Mike | 5000

Но мне нужна самая дорогая машина определенного пользователя, а не первая найденная запись.

Итак, вопрос: Как мне установитьСтол LEFT JOIN будет заказан carPrice, DESC?

Ответы [ 5 ]

45 голосов
/ 18 марта 2011

Попробуйте использовать MAX с GROUP BY.

SELECT u.userName, MAX(c.carPrice)
FROM users u
    LEFT JOIN cars c ON u.id = c.belongsToUser
WHERE u.id = 4;
GROUP BY u.userName;

Дополнительная информация о GROUP BY

Предложение group by используется для разделения выбранных записей на группы на основе уникальных комбинаций группы по столбцам. Это позволяет нам использовать агрегатные функции (например, MAX, MIN, SUM, AVG, ...), которые будут применяться к каждой группе записей по очереди. База данных будет возвращать одну запись результата для каждой группировки.

Например, если у нас есть набор записей, представляющих температуры с течением времени и местоположение в таблице, например:

Location   Time    Temperature
--------   ----    -----------
London     12:00          10.0
Bristol    12:00          12.0
Glasgow    12:00           5.0
London     13:00          14.0
Bristol    13:00          13.0
Glasgow    13:00           7.0
...

Тогда, если мы хотим найти максимальную температуру по местоположению, то нам нужно разделить записи температуры на группы, где каждая запись в определенной группе имеет одинаковое местоположение. Затем мы хотим найти максимальную температуру каждой группы. Запрос для этого будет выглядеть следующим образом:

SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;
16 голосов
/ 19 февраля 2013
   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
11 голосов
/ 18 марта 2011

Несколько других ответов дают решение, используя MAX.В некоторых сценариях использование функции объединения невозможно или нецелесообразно.

Альтернатива, которую я часто использую, - это использование коррелированного подзапроса в соединении ...

SELECT
   `userName`,
   `carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.id = (
  SELECT id FROM `cars` WHERE BelongsToUser = users.id ORDER BY carPrice DESC LIMIT 1
)
WHERE `id`='4'
7 голосов
/ 18 марта 2011

Это даст вам самый дорогой автомобиль для пользователя:

SELECT users.userName, MAX(cars.carPrice)
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName

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

Итак, вопрос: Как настроить таблицу LEFT JOIN для упорядочения carPrice, DESC?

Так что вы можете попробовать это:

SELECT users.userName, cars.carPrice
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
ORDER BY users.userName ASC, cars.carPrice DESC
2 голосов
/ 18 марта 2011

попробуйте это:

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
   ORDER BY `carPrice` DESC
   LIMIT 1

Феликс

...