Wie erhalte ich eine Anzahl von zugehörigen Zeilen in einem links in MySQL join?
Frage
Ich habe zwei Tabellen, eine vehicle
Tabelle mit Spalten:
-
id
-
stock
-
year
-
make
-
model
und eine images
Tabelle mit Spalten:
-
id
-
vehicle_id
-
name
-
caption
-
default tinyint(1)
Ich versuche, die Fahrzeuginformationen, die Standardbild aufzulisten, und eine Gesamtanzahl von Bildern das Fahrzeug hat. Derzeit bin ich mit der folgenden SELECT
Anweisung:
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
ich zunächst wurde mit:
ON vehicle.id = images.vehicle_id AND images.default = 1
aber dann zählen die Bilder wären nur 1 oder 0 abhängig, wenn es ein Standardbild in der Datenbank ist. Ich habe UNION
und andere SELECT
Aussagen versucht mit, aber ich bin immer noch nicht das gewünschte Ergebnis zu erhalten. Muß ich zwei SELECT
Aussagen verwenden, oder gibt es eine andere Möglichkeit, es mit JOIN
oder UNION
zu behandeln?
Lösung
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`
Andere Tipps
In der Art und Weise die Antwort schon sagt, erhalten Sie die Werte von „Fahrzeug“ wiederholt. Ein besserer Weg ist, um Gruppenergebnisse. Versuchen ohne 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`
Lassen Sie mich es für alle klar machen!
Task : Druck 3 Spalten Tabelle:
- Vehicles (Titel) von Fahrzeuge Tabelle.
- Anzahl der Kommentare für jedes Fahrzeug von Kommentare Tabelle.
- Anzahl der Bilder für jedes Fahrzeug von Bilder Tabelle.
Erwarteter Ausgang (nur ein Beispiel) :
+----------------------+----------------+--------------+
| title | comments_count | images_count |
+----------------------+----------------+--------------+
| BMW X6 | 35 | 9 |
| Audi A6 | 3 | 5 |
| Volkswagen Passat B6 | 78 | 6 |
| Volkswagen Passat B5 | 129 | 4 |
+----------------------+----------------+--------------+
Lösung :
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