1

こんにちは、このクエリを書く正しい方法が見つからないようです。2 つのエンティティ Web サイトとクライアントがあり、id フィールドを介してそれらを関連付けるテーブルがあります。

これは多対多の関係です。つまり、Web サイトは複数のクライアントを持つことができ、クライアントは複数の Web サイトを持つことができます。

すべての Web サイトとそれらに属するクライアントを返すクエリを作成しようとしています。クライアントが関連付けられていない場合でも、すべての Web サイトを返したいと考えています。現時点で作業しているクエリは次のとおりです。

3 つのテーブルは、ost_sites = ウェブサイト、ost_site_auth = リレーショナル テーブル、ost_clients = クライアントです。

SELECT 
    ost_sites.site_id, 
    ost_sites.name,
    ost_sites.site_url,
    ost_site_auth.site_id,
    ost_site_auth.client_id 
    ost_clients.client_id,
    CONCAT_WS(" ", ost_clients.lastname, ost_clients.firstname) as name,
FROM ost_sites
LEFT JOIN (ost_site_auth, ost_clients) 
    ON (ost_sites.site_id=ost_site_auth.site_id 
        AND ost_site_auth.client_id=ost_clients.client_id)
GROUP BY ost_sites.name

結果セットを取得しましたが、すべてのサイトが返されるわけではなく、すべての行にクライアントが関連付けられていません。

助けてくれてありがとう!

編集:

テーブルの列は次のとおりです。

ost_site

site_id |    name    | site_url
1          facebook    facebook.com
2          twitter     twitter.com
3          tubmblr     tumblr.com
4          google      google.com

ost_site_auth

(認証リストに site_id = 3 がないことに注意してください)

id |   site_id    | client_id
1        1             1
2        1             2
3        2             1 
4        2             2
5        4             1
6        4             4

ost_client

client_id  |  firstname  |  lastname
1              wilma         flintstone
2              bam           bam
3              fred          flintstone
4              barney        rubble

期待される出力:

site_id |    name    |    site_url    |      client_name     |
1          facebook    facebook.com        wilma flintstone
1          facebook    facebook.com        bam bam
2          twitter     twitter.com         wilma flintstone
2          twitter     twitter.com         bam bam
4          google      google.com          wilma flintstone
4          google      google.com          barney rubble
3          tumblr      tumlr.com           NULL
4

2 に答える 2

2

あなたの結合は少しずれているように見えます...これを試してください

SELECT 
    ost_sites.site_id, 
    ost_sites.name,
    ost_sites.site_url,
    ost_site_auth.site_id,
    ost_site_auth.client_id 
    ost_clients.client_id,
    CONCAT_WS(" ", ost_clients.lastname, ost_clients.firstname) as name

FROM ost_sites

LEFT OUTER JOIN ost_site_auth 
    ON ost_sites.site_id=ost_site_auth.site_id 

LEFT OUTER JOIN ost_clients
    ON ost_site_auth.client_id=ost_clients.client_id

ORDER BY ost_sites.name

これについて少し説明させてください...

  • ost_sitesテーブルから開始し、他のテーブルで何かが一致するかどうかに関係なく、そのテーブルからの すべての結果が必要です。
  • 次に、left outer joinテーブルに対してa を実行しますost_site_auth。つまり、 fromost_site_authが in の何かと一致しない場合ost_sites、それは返されません。ただし、一部がost_sites一致しないものはost_site_auth返品されleft outerます。
  • 次に、 に対して を繰り返しleft outer joinますost_clients


あなたが何を望んでいるのか分かりません...テーブルにこのデータが表されているとしましょう:

  • サイト #1 にはクライアントがありません
  • サイト #2 には 1 つのクライアントがあります: A
  • サイト #3 には 2 つのクライアントがあります: B、C
  • サイト #4 には 3 つのクライアントがあります: D、E、F
  • サイト #5 にはクライアントがありません
  • クライアント G と H には関連付けられたサイトがありません

クエリ 1

      SELECT 
          ost_sites.site_id as SITE,   
          ost_clients.client_id as CLIENT

      FROM ost_sites

      LEFT OUTER JOIN ost_site_auth 
          ON ost_sites.site_id=ost_site_auth.site_id 

      LEFT OUTER JOIN ost_clients
          ON ost_site_auth.client_id=ost_clients.client_id

      ORDER BY ost_sites.site_id, ost_clients.client_id

それは(基本的に)返されます

SITE     CLIENT 
1        NULL
2        A
3        B
3        C
4        D
4        E
4        F
5        NULL

クエリ 2

      SELECT 
          ost_sites.site_id as SITE,   
          ost_clients.client_id as CLIENT

      FROM ost_sites

      JOIN ost_site_auth 
          ON ost_sites.site_id=ost_site_auth.site_id 

      JOIN ost_clients
          ON ost_site_auth.client_id=ost_clients.client_id

      ORDER BY ost_sites.site_id, ost_clients.client_id

それは(基本的に)返されます

SITE     CLIENT  
2        A
3        B
3        C
4        D
4        E
4        F 

クエリ 3

      SELECT 
          ost_sites.site_id as SITE,   
          ost_clients.client_id as CLIENT

      FROM ost_sites

      FULL OUTER JOIN ost_site_auth 
          ON ost_sites.site_id=ost_site_auth.site_id 

      FULL OUTER JOIN ost_clients
          ON ost_site_auth.client_id=ost_clients.client_id

      ORDER BY ost_sites.site_id, ost_clients.client_id

それは(基本的に)返されます

SITE     CLIENT  
1        NULL
2        A
3        B
3        C
4        D
4        E
4        F
5        NULL
NULL     G
NULL     H 

クエリ 4

      SELECT DISTINCT ost_sites.site_id as SITE 

      FROM ost_sites

      LEFT OUTER JOIN ost_site_auth 
          ON ost_sites.site_id=ost_site_auth.site_id 

      LEFT OUTER JOIN ost_clients
          ON ost_site_auth.client_id=ost_clients.client_id

      ORDER BY ost_sites.site_id 
      ORDER BY ost_sites.site_id 

それは(基本的に)返されます

SITE         
2
3
4 

クエリ 5

      SELECT 
          ost_sites.site_id as SITE,
          count(ost_clients.client_id) as CLIENT_COUNT

      FROM ost_sites

      JOIN ost_site_auth 
          ON ost_sites.site_id=ost_site_auth.site_id 

      JOIN ost_clients
          ON ost_site_auth.client_id=ost_clients.client_id

      GROUP BY ost_sites.site_id 
      ORDER BY ost_sites.site_id 

それは(基本的に)返されます

SITE        CLIENT_COUNT  
2           1
3           2
4           3

クエリ 5

      SELECT 
          ost_sites.site_id as SITE,
          count(ost_clients.client_id) as CLIENT_COUNT

      FROM ost_sites

      LEFT OUTER JOIN ost_site_auth 
          ON ost_sites.site_id=ost_site_auth.site_id 

      LEFT OUTER JOIN ost_clients
          ON ost_site_auth.client_id=ost_clients.client_id

      GROUP BY ost_sites.site_id 
      ORDER BY ost_sites.site_id 

それは(基本的に)返されます

SITE        CLIENT_COUNT  
1           0
2           1
3           2
4           3
5           0
于 2013-10-22T16:06:31.160 に答える