1

嗨,我似乎找不到编写此查询的正确方法。我有两个实体网站和客户端,以及一个通过它们的 id 字段关联它们的表。

这是多对多的关系。即一个网站可以有多个客户,一个客户可以有多个网站。

我正在尝试编写一个查询,该查询返回所有网站以及属于它们的客户端。我想退回所有网站,即使它们没有与之关联的客户。这是我目前正在使用的查询:

这三个表是 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对 table做一个ost_site_auth。这意味着如果 from 中的某些内容与 中的内容ost_site_auth不匹配ost_sites,则不会返回。但是,由于该部分,将返回ost_sites与其中不匹配的内容。ost_site_authleft outer
  • 接下来,我们left outer joinost_clients.


不确定你想要什么......让我们假设我们在表格中表示了这些数据:

  • 站点 #1 没有客户
  • 站点 #2 有一个客户:A
  • 站点 #3 有两个客户端:B、C
  • 站点 #4 有三个客户端:D、E、F
  • 站点 #5 没有客户
  • 客户 G 和 H 没有关联站点

查询一

      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

查询二

      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 

查询三

      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 

查询四

      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 

查询五

      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

查询五

      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 回答
0

查看

MySQL中的完全外连接

我认为你真正需要做的就是做与右外连接相同的查询并将它们联合起来。

于 2013-10-22T16:10:20.730 回答