关于mysql:SQL:完全外部加入不起作用

SQL: FULL Outer Join Not Working

本问题已经有最佳答案,请猛点这里访问。

我有两张桌子,一张空着,另一张没有。

  • Hugot_投票统计:http://prntscr.com/72ft7d
  • Hugot_Comment_Stats:空

我理解我不能使用内部联接,因为它只匹配on部分中指定的值。在这种情况下,一个表没有值。

1
2
3
4
5
6
7
8
9
SELECT  t0.hugot_id                     as hugot_id,
        t0.upvotes                      as upvotes,
        t1.comment_count                as comment_count
FROM
    hugot_votes_stats as t0
FULL OUTER JOIN
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

这是我使用完全联接计算的部分。我所期望的是,如果没有找到,空表(在本例中是注释计数)将显示默认值(即:0)。

然而,我得到了一个错误,正如您所看到的1064-您的SQL语法中有一个错误;请查看与您的MySQL服务器版本相对应的手册,以获得在附近使用的正确语法。


MySQL没有语法关键字FULL OUTER JOIN.,必须使用左联接和右联接的组合才能获得完全联接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT  t0.hugot_id                     as hugot_id,
        t0.upvotes                      as upvotes,
        t1.comment_count                as comment_count
FROM
    hugot_votes_stats as t0
LEFT JOIN
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

UNION ALL

SELECT  t0.hugot_id                     as hugot_id,
        t0.upvotes                      as upvotes,
        t1.comment_count                as comment_count
FROM
    hugot_votes_stats as t0
RIGHT JOIN
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id

这是因为MySQL不支持(或不识别)FULL OUTER JOIN语法。

但是,在MySQL中可以模拟完整的外部连接。

我们实际上需要两个查询。

一个查询返回左侧表中的所有行。(左外部连接。)

我们需要将第二个查询的结果附加到该查询中,这看起来就像第一个查询,只是我们需要右侧的表作为驱动程序,并且需要消除所有匹配的行(以避免复制第一个查询中返回的行)。

我们使用UNION ALL集运算符将第二个查询的结果附加到第一个查询。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT t0.hugot_id                     AS hugot_id
     , t0.upvotes                      AS upvotes
     , t1.comment_count                AS comment_count
  FROM hugot_votes_stats t0
  LEFT
  JOIN hugot_comment_stats t1
    ON t0.hugot_id = t1.hugot_id

 UNION ALL

SELECT t0.hugot_id                     AS hugot_id
     , t0.upvotes                      AS upvotes
     , t1.comment_count                AS comment_count
  FROM hugot_votes_stats t0
 RIGHT
  JOIN hugot_comment_stats t1
    ON t0.hugot_id = t1.hugot_id
 WHERE t0.hugot_id IS NULL

注意第二个查询的WHERE子句中的谓词。它过滤掉所有找到匹配的行。(这些行已由第一个查询返回;第二个查询使用"反联接"模式从t1返回不匹配的行。


您可以使用类似的内容来显示您的信息:

1
2
3
4
5
6
7
8
9
SELECT  t0.hugot_id,
        t0.upvotes,
        ifnull(t1.comment_count,0) as commentcount
FROM
    hugot_votes_stats as t0
left join
    hugot_comment_stats as t1
ON
    t0.hugot_id = t1.hugot_id