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 ?

È stato utile?

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:

  1. Veicoli (titoli) dalla tabella veicoli .
  2. Quantità di commenti per ciascun veicolo dalla tabella commenti .
  3. 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top