Comment obtenir un nombre de lignes associées dans une jointure gauche dans MySQL?
Question
J'ai deux tables, une table véhicule
avec des colonnes:
-
id
-
stock
-
année
-
make
-
modèle
et une table images
avec des colonnes:
-
id
-
id_véhicule
-
nom
-
légende
-
minuscule (1)
J'essaie de répertorier les informations du véhicule, son image par défaut et le nombre total d'images du véhicule. J'utilise actuellement l'instruction SELECT
suivante:
SELECT vehicle.id, vehicle.stock, vehicle.year,
vehicle.make, vehicle.model, images.name,
COUNT(images.id)
FROM vehicle
LEFT JOIN images
ON vehicle.id = images.vehicle_id
J'utilisais initialement:
ON vehicle.id = images.vehicle_id AND images.default = 1
mais le nombre d'images ne serait alors que de 1 ou 0 selon qu'il y avait une image par défaut dans la base de données. J'ai essayé d'utiliser UNION
et d'autres instructions SELECT
mais je ne parviens toujours pas à obtenir un résultat correct. Dois-je utiliser deux instructions SELECT
ou existe-t-il un autre moyen de la gérer avec JOIN
ou UNION
?
La solution
SELECT
`vehicle`.`id`,
`vehicle`.`stock`,
`vehicle`.`year`,
`vehicle`.`make`,
`vehicle`.`model`,
`images`.`name`,
(
SELECT COUNT(*)
FROM `images`
WHERE `vehicle_id` = `vehicle`.`id`
) AS `image_count`
FROM `vehicle`
LEFT JOIN `images`
ON `images`.`vehicle_id` = `vehicle`.`id`
WHERE `images`.`default`
Autres conseils
Comme le suggère le répondeur, vous obtenez des valeurs répétées de "véhicule". Une meilleure façon est de regrouper les résultats. Essayez sans JOIN:
SELECT
`vehicle`.`id`,
`vehicle`.`stock`,
`vehicle`.`year`,
`vehicle`.`make`,
`vehicle`.`model`,
`images`.`name`,
(
SELECT COUNT(*)
FROM `images`
WHERE `vehicle_id` = `vehicle`.`id`
) AS `image_count`
FROM `vehicle`
WHERE `images`.`default`
Permettez-moi de clarifier les choses pour tout le monde!
Tâche : imprimer un tableau à 3 colonnes:
- Véhicules (titres) du tableau Véhicules .
- Nombre de commentaires pour chaque véhicule dans le tableau commentaires .
- Nombre d'images pour chaque véhicule à partir du tableau images .
Résultats attendus (uniquement un exemple) :
+----------------------+----------------+--------------+
| title | comments_count | images_count |
+----------------------+----------------+--------------+
| BMW X6 | 35 | 9 |
| Audi A6 | 3 | 5 |
| Volkswagen Passat B6 | 78 | 6 |
| Volkswagen Passat B5 | 129 | 4 |
+----------------------+----------------+--------------+
Solution :
SELECT
vehicles.title,
(SELECT COUNT(*) FROM comments WHERE vehicles.id = comments.vehicle_id) AS comments_count,
(SELECT COUNT(*) FROM images WHERE vehicles.id = images.vehicle_id) AS images_count
FROM vehicles