Как мне получить количество связанных строк в левом соединении в MySQL?
Вопрос
У меня есть два стола, vehicle
таблица со столбцами:
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
?
Решение
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`
Другие советы
Как предлагает anser, вы получаете повторяющиеся значения "транспортное средство".Лучший способ - это сгруппировать результаты.Попробуйте без ОБЪЕДИНЕНИЯ :
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`
Позвольте мне прояснить это для всех!
Задача:Вывести таблицу из 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