1

PostgreSQL クエリで問題が発生しています

私が欲しいのは、距離順に並べられた「キャンペーン」のリストで、場所からの最小距離 [in_lat、in_lng、in_radius] です。1 回は注文のため、もう 1 回はキャンペーンが希望の半径内にあるかどうかを確認するためです。

また、キャンペーンに複数の「Campaignreceiver」エントリ (receivetype [EMAIL、WEBSITE など]) がある可能性があります。

そして、キャンペーンを一度だけ取得したい。したがって、DISTINCT ON。

問題は、「WHERE distance < in_radius」のように機能させるにはどうすればよいかということです。私の推測では、GROUP BY と HAVING を追加していますが、いくつかのテストを行ったところ、うまくいきませんでした。

どんな助けでも大歓迎です!!!

    SELECT DISTINCT ON (c.campaign_uuid, distance)
            c.campaign_uuid,
            prl.lat,
            prl.long,
            distance_in_km(prl.lat, prl.long, in_lat, in_lng) AS distance                
        FROM 
            usercampaignrelations AS ucr
        LEFT JOIN
            campaignreceivers AS cr
        ON
            ucr.usercampaign_uuid = cr.usercampaign_uuid
        LEFT JOIN
            campaigntargetgrouprelations AS ctg
        ON
            cr.campaigntargetgroup_uuid = ctg.campaigntargetgroup_uuid
        LEFT JOIN
            campaigns AS c
        ON
            ucr.campaign_uuid = c.campaign_uuid
        LEFT JOIN
            companycampaignrelations AS cc
        ON
            c.campaign_uuid = cc.campaign_uuid
        LEFT JOIN
            pointradiuslocations AS prl
        ON
            c.location_uuid = prl.location_uuid
        WHERE 
            ucr.user_uuid = in_user_uuid
        AND
            (cr.status = 'SENT' OR cr.status = 'RETRIEVED')
        AND
            distance_in_km(prl.lat, prl.long, in_latitude, in_longtitude) < in_radius
        ORDER BY
            distance
        LIMIT 
            in_limit
4

1 に答える 1

1

私の知る限り、同じ引数で使用する限り、distance_in_km() は (行ごとに) 1 回だけ呼び出されるため、WHERE と ORDER BY はそれを再度評価しません。

于 2011-06-17T21:23:19.813 に答える