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?
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;
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;
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
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'
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
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