これが私の問題です。顧客がCustomerRegionsテーブルで定義されたいくつかのリージョンにアクセスできると仮定します。
CustomerRegionID | CustomerID | RegionID
----------------------------------------
1 | 1 | 1
2 | 1 | 2
顧客1には3人のユーザー1、2、および3がいると想定します。ユーザーごとに、テーブルUserRegionsを介してアクセスできるCustomerRegionsを指定できます。
UserRegionID | UserID | CustomerRegionID
----------------------------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 2
したがって、ユーザー1はCustomerregionsの両方にアクセスでき、ユーザー2はCustomerRegion2にのみアクセスできます。
特定のユーザーにUserRegionsが指定されている場合、それらのCustomerRegionsのみが結果セットに含まれますが、特定のユーザーにUserRegionsが指定されていない場合、すべてのCustomerRegionsが結果に含まれます。特定の顧客のユーザーごとにすべてのアクセス可能なリージョンを取得したいと思います。私が探している結果は次のようなものです。
CustomerID | UserID | RegionID
------------------------------
1 | 1 | 1
1 | 1 | 2
1 | 2 | 2
1 | 3 | 1
1 | 3 | 2
私の質問は、これを単一のクエリで実行できるのか、そしてどのように実行できるのかということです。
編集:私は今それが機能しているようです:
SELECT CustomerID,
UserID,
RegionID
FROM users
LEFT JOIN customerregions ON customerregions.CustomerID = users.CustomerID
LEFT JOIN userregions ON userregions.UserID = users.UserID AND userregions.CustomerRegionID = customerregions.CustomerRegionID
LEFT JOIN regions ON regions.RegionID = customerregions.RegionID
WHERE (userregions.UserID IS NOT NULL
OR (SELECT COUNT(1) FROM userregions WHERE userregions.UserID = users.UserID) = 0)
AND CustomerID = 1
whereの追加カウントクエリがうまくいくようです。@PabloMartinezにご協力いただきありがとうございます。しかし、誰かがこれを行うためのより良い方法を知っているなら、私に知らせてください。