mysql - 如果不存在子集,则选择全部,否则选择子集

标签 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 将只能访问客户区域 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

where 中的额外计数查询似乎可以解决问题。感谢@Pablo Martinez 的帮助。但是,如果有人知道执行此操作的更好方法,请告诉我。

最佳答案

我同意@diEcho,表结构很困惑

您是否尝试加入?

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

关于mysql - 如果不存在子集,则选择全部,否则选择子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309572/

相关文章:

mysql - mysql latin1 是否也支持 emoji 字符?

MySQL "load data local infile"只加载 1 行

r - 根据条件使用另一个值的值更新数据框中的整个列

linq-to-sql - linq to sql:连接同一表中的多个列

mysql - 将 MySQL 字符串日期转换为 Y-m-d H :i:s

php - 客户端和服务器 php sql bug

c++ - 服务器不响应使用 select() 的新客户端,cpp

css - ExtJs 3.4 - 无法在 FireFox 的文本字段中选择文本

mysql - 从 sql 数据库中选择最后一个条目

SQL 加入空值