如果不存在子集,则选择all,否则选择子集

时间:2012-07-03 11:03:20

标签: mysql select join

好的,这是我的问题。假设客户可以访问CustomerRegions表中定义的许多区域:

CustomerRegionID | CustomerID | RegionID
----------------------------------------
               1 |          1 |        1
               2 |          1 |        2

假设客户1有三个用户1,2和3.对于每个用户,我们可以通过表UserRegions指定他们可以访问哪个CustomerRegions:

UserRegionID | UserID | CustomerRegionID
----------------------------------------
           1 |      1 |                1
           2 |      1 |                2
           3 |      2 |                2  

因此,用户1可以访问两个客户区域,用户2只能访问CustomerRegion 2.

如果为给定用户指定了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

额外的计数查询在哪里似乎做了伎俩。谢谢@Pablo Martinez的帮助。但是,如果有人知道更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

我同意@diEcho,表结构很混乱

你有尝试加入吗?

Select CustomerID, UserID, RegionID 
    from UserRegions join CustomerRegion 
         on  CustomerRegion.CustomerRegionID=UserRegions.CustomerRegionID  
    where customerID=1