2009-04-30 9 views
10

Mam dwie tabele, A vehicle tabeli z kolumnami:Jak uzyskać liczbę powiązanych wierszy w lewym złączeniu w MySQL?

  • id
  • stock
  • year
  • make
  • model

i images tabela z kolumnami:

  • id
  • vehicle_id
  • name
  • caption
  • default tinyint(1)

staram się notować informacje pojazdu, jego domyślny obraz, a całkowita liczba obrazów pojazdu. Obecnie używam następujący SELECT oświadczenie:

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 

początkowo używał:

ON vehicle.id = images.vehicle_id AND images.default = 1 

ale potem liczyć obrazy byłyby tylko 1 lub 0 w zależności czy istnieje domyślny obraz w bazie danych. Próbowałem używać UNION i innych instrukcji SELECT, ale nadal nie mogę uzyskać prawidłowego wyniku. Czy muszę używać dwóch instrukcji SELECT lub czy istnieje inny sposób na obsłużenie go za pomocą JOIN lub UNION?

Odpowiedz

23
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` 
+0

zgadzam. Byłby to właściwy sposób na zrobienie tego. Mogę wymyślić inny sposób (polegający na użyciu podkwerendy zamiast tabeli obrazów prostych), ale jest on hacky i ohydny (i tylko dla zabawy). To jest właściwy sposób, aby to zrobić. – MBCook

+0

+1 za to. Oczyściłem go trochę, aby pozbyć się zwoju. – TheTXI

+0

Czy lepiej używać COUNT (id) zamiast COUNT (*), więc nie wybieram wszystkich kolumn? –

5

W sposób sugerowany przez anser otrzymujesz powtarzające się wartości "pojazdu". Lepszym sposobem jest grupowanie wyników. Wypróbuj bez 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` 
+0

Ta jest lepsza niż zaakceptowana odpowiedź, @giuseppe spróbuj edytować zaakceptowaną odpowiedź, może autor ją zmieni –

1

Pozwól, że wyjaśnię to wszystkim!

Zadanie: Print 3 kolumny tabeli:

  1. Pojazdów (tytuły) z pojazdów stołowych.
  2. Ilość komentarzy do każdego pojazdu od komentarze tabela.
  3. Ilość zdjęć dla każdego pojazdu z obrazów tabeli.

Oczekiwany wyjścia (tylko przykład):

+----------------------+----------------+--------------+ 
|  title   | comments_count | images_count | 
+----------------------+----------------+--------------+ 
| BMW X6    |    35 |   9 | 
| Audi A6    |    3 |   5 | 
| Volkswagen Passat B6 |    78 |   6 | 
| Volkswagen Passat B5 |   129 |   4 | 
+----------------------+----------------+--------------+ 

Rozwiązanie:

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