首先,我甚至不确定LEFT JOIN
是否是做我想做的最佳方式,所以最好先解释一下。
我有2个表 - 一个包含站点列表,另一个包含角色列表。用户可能只有一个角色,但他们可能拥有与站点一样多的角色。
表'网站'
site_id | site_name | site_domain
---------------------------------------
1 | Site A | sitea.com
2 | Site B | siteb.com
表'角色'
site_id | user_id | role_id
---------------------------------
1 | 1 | 1
1 | 2 | 1
2 | 2 | 2
如上例所示,用户1在一个站点上只有一个角色,但用户2在两个不同的站点上有两个角色。
我想做什么,而且可能只是一个星期天晚上没有想到直接的事情,就是获取一个网站列表,以及每个用户的角色 - 如果该网站没有任何角色用户,然后返回NULL(或0)。
应该如何产生输出的两个例子:
用户1
site_id | site_name | site_domain | role_id
----------------------------------------------
1 | Site A | sitea.com | 1
2 | Site B | siteb.com | NULL
用户2
site_id | site_name | site_domain | role_id
----------------------------------------------
1 | Site A | sitea.com | 1
2 | Site B | siteb.com | 2
我目前的查询在下面,但是,第二个站点没有出现,因为用户没有定义角色(例如,如上所述,但对于用户1,第二站点B将不会列出)。我知道我只是错过了一些东西,但今晚想不到它:o(
SELECT site_id, site_name, site_domain, role_id
FROM `sites`
LEFT JOIN `roles`
ON sites.site_id=roles.site_id
WHERE roles.user_id='1'
答案 0 :(得分:3)
您需要做的是从一个结合了所有网站和用户的表开始。然后加入roles
表中的信息:
select s.site_id, s.site_name, s.site_domain, u.user_id, r.role_id
from (select distinct user_id from roles) u cross join
sites s left outer join
roles r
on s.site_id = r.site_id and
u.user_id = r.user_id
如果您有一个users表,那么您可以用该表替换第一个子查询。
对于涉及单个用户的站点,您只需在子查询中放置一个常量:
select s.site_id, s.site_name, s.site_domain, u.user_id, r.role_id
from (select 1 as user_id) u cross join
sites s left outer join
roles r
on s.site_id = r.site_id and
u.user_id = r.user_id
或where
条款:where u.user_id = 1
。