3

まず、私がLEFT JOINやりたいことを行うための最良の方法であるかどうかさえわからないので、説明するために最善を尽くします.

2 つのテーブルがあります。1 つはサイトのリストを含み、もう 1 つはロールのリストを含みます。ユーザーは 1 つのロールしか持たないかもしれませんが、サイトと同じ数のロールを持つことができます。

テーブル「サイト」

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 は 1 つのサイトで 1 つの役割しか持っていませんが、ユーザー 2 は 2 つの異なるサイトで 2 つの役割を持っています。

私がやりたいことは、おそらく日曜の夜で、単純なことを考えていないだけですが、個々のユーザーの役割とともに、サイトのリストを取得することです。ユーザーのそのサイトに役割が存在しない場合は、 NULL (または 0) を返します。

出力結果の 2 つの例:

ユーザー 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

現時点でのクエリは次のとおりですが、ユーザーに役割が定義されていないため、2 番目のサイトは表示されません (つまり、上記のように、ユーザー 1 の場合、2 番目のサイト 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'
4

1 に答える 1

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.

于 2013-03-03T20:24:43.073 に答える