MySQLの左結合で関連する行の数を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/808475

質問

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列の表を印刷します:

  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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top