Come posso ottenere un conteggio delle righe associate in un join sinistro in MySQL?
Domanda
Ho due tabelle, una tabella veicolo
con colonne:
-
id
-
Immagine
-
Anno
-
make
-
modello
e una immagini
con colonne:
-
id
-
vehicle_id
-
nome
-
caption
-
default tinyint (1)
Sto cercando di elencare le informazioni del veicolo, la sua immagine predefinita e un conteggio totale delle immagini del veicolo. Attualmente sto usando la seguente istruzione SELECT
:
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
Inizialmente stavo usando:
ON vehicle.id = images.vehicle_id AND images.default = 1
ma il conteggio delle immagini sarebbe solo 1 o 0 a seconda che nel database fosse presente un'immagine predefinita. Ho provato a utilizzare UNION
e altre istruzioni SELECT
ma non riesco ancora a ottenere un risultato corretto. Devo usare due istruzioni SELECT
o esiste un altro modo per gestirlo con JOIN
o UNION
?
Soluzione
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`
Altri suggerimenti
Nel modo suggerito dalla risposta, ottieni valori ripetuti di "veicolo". Un modo migliore è raggruppare i risultati. Prova senza 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`
Lascia che sia chiaro per tutti!
Attività : stampa tabella a 3 colonne:
- Veicoli (titoli) dalla tabella veicoli .
- Quantità di commenti per ciascun veicolo dalla tabella commenti .
- Quantità di immagini per ciascun veicolo dalla tabella immagini .
Output previsto (solo un esempio) :
+----------------------+----------------+--------------+
| title | comments_count | images_count |
+----------------------+----------------+--------------+
| BMW X6 | 35 | 9 |
| Audi A6 | 3 | 5 |
| Volkswagen Passat B6 | 78 | 6 |
| Volkswagen Passat B5 | 129 | 4 |
+----------------------+----------------+--------------+
Soluzione :
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