无法在 mysql 中正确连接两个表
Can't join two tables properly in mysql
我有这两个table
N-table M-table
----------------------------- -----------------------------
| date | id | n-value | | date | id | m-value |
|------------|----|---------| |------------|----|---------|
| 2015-08-01 | 7 | 100 | | 2015-09-01 | 7 | 200 |
| 2015-09-01 | 8 | 10 | -----------------------------
-----------------------------
我想像这样加入这两个table
---------------------------------------------------
| date | id | n-value | m-value |
-------------|----|---------------|---------------|
| 2015-08-01 | 7 | 100 | null ( or 0 ) |
| 2015-09-01 | 7 | null ( or 0 ) | 200 |
| 2015-09-01 | 8 | 10 | null ( or 0 ) |
---------------------------------------------------
我做了这个查询:
SELECT n.date , n.id , n.n-value, m.m-value FROM n
LEFT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
但输出不正确:
---------------------------------------------------
| date | id | n-value | m-value |
-------------|----|---------------|---------------|
| 2015-08-01 | 7 | 100 | null |
| 2015-09-01 | 8 | 10 | null |
---------------------------------------------------
我的查询有什么问题?
如果您使用的是 ANSI SQL RDBMS,那么您会:
SELECT n.date , n.id, m.id , n.n-value, m.m-value FROM n
FULL OUTER JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
当没有匹配项时,这会从 table 中选择结果。
左外连接获取左侧的所有项目并包括右侧没有匹配项的空值,而右外连接则相反。全包两面。
请注意,您还需要在 "expected" table 的中间行包括 m.id,没有 n.id。
但是,正如指出的那样,mySQL 不支持完全外部联接,因此您可以使用(如以下评论中的 link 所述)
SELECT n.date , n.id, n.n-value, m.m-value FROM n
LEFT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
UNION
SELECT m.date , m.id , n.n-value, m.m-value FROM n
RIGHT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
您应该告诉查询将正确的 table 内容放在顶行,但按您希望的方式组织。
我有这两个table
N-table M-table
----------------------------- -----------------------------
| date | id | n-value | | date | id | m-value |
|------------|----|---------| |------------|----|---------|
| 2015-08-01 | 7 | 100 | | 2015-09-01 | 7 | 200 |
| 2015-09-01 | 8 | 10 | -----------------------------
-----------------------------
我想像这样加入这两个table
---------------------------------------------------
| date | id | n-value | m-value |
-------------|----|---------------|---------------|
| 2015-08-01 | 7 | 100 | null ( or 0 ) |
| 2015-09-01 | 7 | null ( or 0 ) | 200 |
| 2015-09-01 | 8 | 10 | null ( or 0 ) |
---------------------------------------------------
我做了这个查询:
SELECT n.date , n.id , n.n-value, m.m-value FROM n
LEFT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
但输出不正确:
---------------------------------------------------
| date | id | n-value | m-value |
-------------|----|---------------|---------------|
| 2015-08-01 | 7 | 100 | null |
| 2015-09-01 | 8 | 10 | null |
---------------------------------------------------
我的查询有什么问题?
如果您使用的是 ANSI SQL RDBMS,那么您会:
SELECT n.date , n.id, m.id , n.n-value, m.m-value FROM n
FULL OUTER JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
当没有匹配项时,这会从 table 中选择结果。
左外连接获取左侧的所有项目并包括右侧没有匹配项的空值,而右外连接则相反。全包两面。
请注意,您还需要在 "expected" table 的中间行包括 m.id,没有 n.id。
但是,正如指出的那样,mySQL 不支持完全外部联接,因此您可以使用(如以下评论中的 link 所述)
SELECT n.date , n.id, n.n-value, m.m-value FROM n
LEFT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
UNION
SELECT m.date , m.id , n.n-value, m.m-value FROM n
RIGHT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date
您应该告诉查询将正确的 table 内容放在顶行,但按您希望的方式组织。