このクエリを何百万もの方法で試しましたが、「count_lonely_vehicles」を正しく選択できないようです。'count_lonely_vehicles'副選択は、現在、1つのVehicle_idアソシエーションを持つ写真の総数をカウントしますが、他のSELECTのようにdealership.idをGROUPBYしたものではありません。
dealerships (has many vehicles)
-----------
id | name
vehicles (has many photos and belongs to dealership)
--------
id | dealership_id
photos (belongs to vehicle)
------
id | vehicle_id
SELECT DISTINCT
dealerships.id,
dealerships.name,
COUNT(photos.id) AS 'count_photos',
FLOOR(COUNT(photos.id) / COUNT(DISTINCT vehicles.id)) AS 'photos_per_vehicle',
(
SELECT COUNT(*)
FROM (
SELECT COUNT(photos.vehicle_id) AS 'count'
FROM photos
GROUP BY photos.vehicle_id
HAVING COUNT(photos.vehicle_id) = 1
) AS tbl
) AS 'count_lonely_vehicles'
FROM dealerships
JOIN vehicles ON vehicles.dealership_id = dealerships.id
JOIN photos ON photos.vehicle_id = vehicles.id
GROUP BY dealerships.id
ORDER BY count_photos DESC
したがって、テンプレート内のディーラー配列をループして「count_lonely_vehicles」を吐き出す場合、それは常に同じ数です。意図された動作は、ディーラーごとに1つのVehicle_idアソシエーションで写真レコードの数を収集することです。
これを達成するためにこのクエリを書き直すにはどうすればよいですか?
編集:回答済み
これは、選択した回答から多くの助けを得た後、最終的に機能したクエリです。また、選択した回答で誤っていたいくつかのフィールド名を修正する必要がありました。
SELECT
dealerships.id,
dealerships.name,
COUNT(photos.id) AS 'count_photos',
FLOOR(COUNT(DISTINCT photos.id) / COUNT(DISTINCT vehicles.id)) AS 'photos_per_vehicle',
l.num_lonely
FROM dealerships
JOIN vehicles ON vehicles.dealership_id = dealerships.id
JOIN photos ON photos.vehicle_id = vehicles.id
LEFT OUTER JOIN (
SELECT
v.dealership_id,
COUNT(*) AS num_lonely
FROM dealerships d
JOIN vehicles v ON v.dealership_id = d.id
JOIN (
SELECT p.vehicle_id
FROM photos p
GROUP BY p.vehicle_id
HAVING COUNT(*) = 1
) p ON p.vehicle_id = v.id
GROUP BY d.id
) l ON vehicles.dealership_id = l.dealership_id
GROUP BY dealerships.id
ORDER BY count_photos DESC