Подтвердить что ты не робот

Как отсортировать порядок LEFT JOIN в SQL-запросе?

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

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

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?

4b9b3361

Ответ 1

Попробуйте использовать 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;

Ответ 2

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'

Ответ 3

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

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

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'

Ответ 4

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

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

Ответ 5

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

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

Феликс