MySQL多个左连接在一个表上

时间:2015-01-22 15:09:10

标签: mysql sql join left-join

我有一个包含公司和域名的数据库。我的目标是将所有社交媒体渠道链接到每个国家/地区的域名

SELECT 
  yt.screen_name,
  tw.screen_name,
  gp.id,
  fb.title,
  dom.domain_name,
  dom.type,
  dom.url
FROM
  domain AS dom1
  LEFT JOIN youtube AS yt
    ON yt.company_name = dom1.company_name 
    AND domain AS dom2
  LEFT JOIN twitter AS tw
    ON tw.company_name = dom2.company_name 
    AND domain AS dom3
  LEFT JOIN googleplus AS gp
    ON gp.company_name = dom3.company_name 
    AND domain AS dom4
  LEFT JOIN facebook AS fb
    ON fb.company_name = dom4.company_name 
WHERE 
  yt.screen_name IS NOT NULL
  OR tw.screen_name IS NOT NULL
  OR gp.id IS NOT NULL
  OR fb.title IS NOT NULL
ORDER BY dom.url

我的目标是获得这样的表:

yt.screen_name | tw.screen_name | gp.id | fb.title | dom.domain_name | dom.type | dom.url
foo             NULL             NULL    NULL       foo.com           website    http://www.foo.com
NULL            foo              NULL    NULL       foo.com           website    http://www.foo.com 
NULL            NULL             0478174 NULL       foo.com           website    http://www.foo.com

这可能吗?

2 个答案:

答案 0 :(得分:2)

试试这个

SELECT DISTINCT
  yt.screen_name,
  tw.screen_name,
  gp.id,
  fb.title,
  dom1.domain_name,
  dom1.type,
  dom1.url
FROM
  domain AS dom1
  LEFT JOIN youtube AS yt
    ON yt.company_name = dom1.company_name 

  LEFT JOIN twitter AS tw
    ON tw.company_name = dom1.company_name 

  LEFT JOIN googleplus AS gp
    ON gp.company_name = dom1.company_name 

  LEFT JOIN facebook AS fb
    ON fb.company_name = dom1.company_name 
WHERE 
  yt.screen_name IS NOT NULL
  OR tw.screen_name IS NOT NULL
  OR gp.id IS NOT NULL
  OR fb.title IS NOT NULL
ORDER BY dom1.url

答案 1 :(得分:1)

你试图做的事似乎是合理的...我认为这里的问题是你的连接条件中有一些语法错误。而不是你拥有的,尝试:

SELECT 
  yt.screen_name,
  tw.screen_name,
  gp.id,
  fb.title,
  dom.domain_name,
  dom.type,
  dom.url
FROM
  domain AS dom
  LEFT JOIN youtube AS yt
    ON yt.company_name = dom.company_name 
  LEFT JOIN twitter AS tw
    ON tw.company_name = dom.company_name 
  LEFT JOIN googleplus AS gp
    ON gp.company_name = dom.company_name 
  LEFT JOIN facebook AS fb
    ON fb.company_name = dom.company_name 
WHERE 
  yt.screen_name IS NOT NULL
  OR tw.screen_name IS NOT NULL
  OR gp.id IS NOT NULL
  OR fb.title IS NOT NULL
ORDER BY dom.url

这里的不同之处在于,我们不是遍历dom1,dom2,dom3的多个版本,而是使用域表(别名为dom)并根据公司名称将所有公司表连接到dom。

我需要明确指出

 LEFT JOIN youtube AS yt
    ON yt.company_name = dom1.company_name 
    AND domain AS dom2

是无效的SQL语法,并且您还引用了dom的值(例如dom.domain_name,dom.type等),而实际上没有一个别名为dom的表。相反,您将表引用为dom1,然后尝试迭代它。我不是百分百肯定,但我认为你正在考虑将这些dom1,dom2,dom3等作为域表中行的引用。如果是这样,那就没有必要了。您有一个表(域名,别名为dom),您想要加入公司查找表(youtube,twitter,googleplus,facebook)。你不需要dom1,dom2等。