我在2个不同的数据库上有2个表:
db1.table1
+--------------+--------------------------+
| Username | Message |
+--------------+--------------------------+
| jamesbond | I need some help |
| jamesbond | I need some help |
| jamesbond | I need some help |
| jamesbond | Mission accomplished |
+--------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)
db2.table2
+--------------------------+--------------+
| Message | Status |
+--------------------------+--------------+
| I need some help | Ok |
| I need some help | Ok |
| I need some help | Bad |
+--------------------------+--------------+
Run Code Online (Sandbox Code Playgroud)
当我使用这种SQL语法'INNER JOIN'那些表时:
SELECT A.Username, A.Message
SUM(CASE WHEN `status` = 'Ok' THEN 1 ELSE 0 END) AS StatOK,
SUM(CASE WHEN `status` = 'Bad' THEN 1 ELSE 0 END) AS StatBAD
FROM db1.table1 as A
INNER JOIN db2.table2 as B
ON A.Message = B.Message
WHERE A.Username = 'jamesbond'
GROUP BY A.Username, A.Message
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果:
+--------------+--------------------------+--------+---------+
| Username | Message | StatOK | StatBAD |
+--------------+--------------------------+--------+---------+
| jamesbond | I need some help | 2 | 1 |
+--------------+--------------------------+--------+---------+
Run Code Online (Sandbox Code Playgroud)
如何获得这样的结果(DB2上仍然没有状态的消息,但SUM结果可以是ZERO或NULL):
+--------------+--------------------------+--------+---------+
| Username | Message | StatOK | StatBAD |
+--------------+--------------------------+--------+---------+
| jamesbond | I need some help | 2 | 1 |
| jamesbond | Mission accomplished | NULL | NULL |
+--------------+--------------------------+--------+---------+
Run Code Online (Sandbox Code Playgroud)
你需要一个Left Outer Join,它将从Left表中获取行,如果它与Right表不匹配,那么你将获得NULL.
SELECT A.Username, A.Message
SUM(CASE WHEN `status` = 'Ok' THEN 1 ELSE 0 END) AS StatOK,
SUM(CASE WHEN `status` = 'Bad' THEN 1 ELSE 0 END) AS StatBAD
FROM db1.table1 as A
LEFT OUTER JOIN db2.table2 as B
ON A.Message = B.Message
WHERE A.Username = 'jamesbond'
GROUP BY A.Username, A.Message
Run Code Online (Sandbox Code Playgroud)