Pergunta

Eu tenho duas tabelas, uma tabela vehicle com colunas:

  • id
  • stock
  • year
  • make
  • model

e uma mesa images com colunas:

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

Eu estou tentando listar informações do veículo, a sua imagem padrão, e uma contagem total de imagens do veículo tem. Atualmente estou usando a seguinte declaração 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

Inicialmente eu estava usando:

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

mas então a contagem de imagens seria apenas 1 ou 0 dependendo se havia uma imagem padrão no banco de dados. Eu tentei usar UNION e outros SELECT declarações, mas eu ainda sou incapaz de obter um bom resultado. Eu preciso usar duas declarações SELECT ou há outra maneira de lidar com isso com JOIN ou UNION?

Foi útil?

Solução

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`

Outras dicas

No caminho a resposta sugere, você se repetem valores do "veículo". A melhor maneira, é resultados do grupo. Experimente sem a 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`

Deixe-me deixar claro para todos!

Task : Imprimir 3 colunas da tabela:

  1. Veículos (títulos) de veículos tabela.
  2. quantidade de comentários para cada veículo de comentários tabela.
  3. quantidade de imagens para cada veículo de images tabela.

resultado esperado (apenas um exemplo) :

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

Solução :

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top