2009-04-30 4 views
10

У меня есть две тумбочки, vehicle таблицы со столбцами:Как получить количество связанных строк в левом соединении в MySQL?

  • id
  • stock
  • year
  • make
  • model

и images таблица со столбцами:

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

Я пытаюсь вывести информацию транспортного средства, его изображение по умолчанию, и в общей сложности количество изображений на транспортном средстве. В настоящее время я использую следующий 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 

Первоначально я использовал:

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

но рассчитывать изображения будет только 1 или 0 в зависимости, есть ли по умолчанию изображения в базе данных. Я пробовал использовать UNION и другие операторы SELECT, но я все еще не могу получить правильный результат. Нужно ли использовать два оператора SELECT или есть ли другой способ его обработки с помощью JOIN или UNION?

ответ

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

Я согласен. Это был бы правильный способ сделать это. Я могу думать о другом способе (с использованием подзапроса вместо таблицы прямых изображений), но он взломан и отвратителен (и просто для удовольствия). Это правильный способ сделать это. – MBCook

+0

+1 для этого. Я немного очистил его, чтобы избавиться от прокрутки. – TheTXI

+0

Лучше ли использовать COUNT (id) вместо COUNT (*), чтобы я не выбирал все столбцы? –

5

В соответствии с тем, что предлагает анзер, вы получаете повторяющиеся значения «транспортного средства». Лучший способ - собрать результаты. Попробуйте без СОСТАВА:

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

Этот вариант лучше, чем принятый ответ, @giuseppe попытается отредактировать принятый ответ, возможно, автор изменит его –

1

Позвольте мне дать понять всем!

Задача: Печать 3 колонки таблицы:

  1. транспортных средств (названия) от автомобилей таблицы.
  2. Количество комментариев для каждого транспортного средства от комментарии стол.
  3. Количество изображений для каждого транспортного средства от изображений стол.

Ожидаемый результат (просто пример):

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

Решение:

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 
Смежные вопросы