web-dev-qa-db-fra.com

comment trier l'ordre de LEFT JOIN dans une requête SQL?

OK, j'ai essayé de googler pour une réponse comme une folle, mais je n'ai pas pu résoudre cela, alors j'espère que quelqu'un pourra aider.

Disons que j'ai un tableau d'utilisateurs, tableau très simple:

id | userName
3    Michael
4    Mike
5    George

et j'ai une autre table de leurs voitures et de leurs prix.

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

Maintenant, ce que je dois faire, c'est quelque chose comme ça (n'hésitez pas à réécrire):

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

Qui retourne:

Mike | 5000

Mais j'ai besoin de la voiture la plus chère d'un certain utilisateur, pas de la première entrée trouvée.

Donc, question: comment définir la table LEFT JOIN à commander par carPrice, DESC?

40
Richard Rodriguez

Essayez d'utiliser MAX avec un 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;

Plus d'informations sur GROUP BY

La clause group by est utilisée pour diviser les enregistrements sélectionnés en groupes sur la base de combinaisons uniques du groupe par colonnes. Cela nous permet ensuite d'utiliser des fonctions d'agrégation (par exemple, MAX, MIN, SUM, AVG, ...) qui seront appliquées à chaque groupe d'enregistrements tour à tour. La base de données renverra un seul enregistrement de résultat pour chaque groupe.

Par exemple, si nous avons un ensemble d'enregistrements représentant les températures dans le temps et l'emplacement dans un tableau comme celui-ci:

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
...

Ensuite, si nous voulons trouver la température maximale par emplacement, nous devons diviser les enregistrements de température en groupes, où chaque enregistrement d'un groupe particulier a le même emplacement. Nous voulons ensuite trouver la température maximale de chaque groupe. La requête pour ce faire serait la suivante:

SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;
47
a'r
   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
16
vencedor

Plusieurs autres réponses donnent la solution en utilisant MAX. Dans certains scénarios, l'utilisation d'une fonction d'agrégation n'est pas possible ou n'est pas performante.

L'alternative que j'utilise beaucoup est d'utiliser une sous-requête corrélée dans la jointure ...

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'
12
MatBailie

Cela vous procurera la voiture la plus chère pour l'utilisateur:

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

Cependant, cette déclaration me fait penser que vous voulez que tous les prix des voitures soient triés, en ordre décroissant:

Donc, question: comment définir la table LEFT JOIN à commander par carPrice, DESC?

Vous pouvez donc essayer ceci:

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
7

essayez ceci:

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

Felix

2
Felix Geenen