2

このクエリを何百万もの方法で試しましたが、「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
4

2 に答える 2

4

あなたが欲しいものを手に入れるためにあなたはディーラー情報に参加する必要があります。サブクエリを「FROM」句に移動してこれを行うことをお勧めします。

FROM dealerships JOIN
     vehicles
     ON vehicles.dealership_id = dealerships.id JOIN
     photos ON photos.vehicle_id = vehicles.id left outer join
     (select d.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.dealership_id
     ) l
     on d.dealership_id = l.dealership_id

テーブルを結合して相関サブクエリを実行することで修正することもできます。

于 2012-06-22T16:47:24.827 に答える
1

メインのディーラー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(photo2.vehicle_id) AS 'count'
            FROM photos photo2
            JOIN vehicles vehicle2 on photo2.vehicle_id = vehicle2.vehicle_id 
            WHERE vehicle2.dealership_id = dealerships.dealership_id
            GROUP BY photo2.vehicle_id
            HAVING COUNT(photo2.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
于 2012-06-22T16:47:29.290 に答える