MySQLの左結合で関連する行の数を取得するにはどうすればよいですか?
質問
2つのテーブル、列を持つ 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
ステートメントを使用しようとしましたが、適切な結果を得ることができません。 2つの 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`
他のヒント
アンサーが示唆するように、「車両」の繰り返し値を取得します。より良い方法は、結果をグループ化することです。参加せずに試してください:
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
所属していません StackOverflow