因此,我正在尝试根据我已经编写的几个 MySQL View 构建一份相当于报告的内容。每个 View 都有三列,看起来像这样
View ABC:
-------------------------------
| A | B | C |
| | | |
-------------------------------
| data1 | asdf | 3 |
| data1 | jkl; | 1 |
-------------------------------
假设还有其他三个结构相同的 View ,名为 DEF、GHI 和 JKL。在 View DEF 中,最后一列名为 D,在 GHI 中最后一列名为 E,在 JKL 中最后一列名为 F。
在每个 View 中,A 列中的值对于所有行都应该相同(这是解决我遇到的问题的另一种方法,它不完全依赖 MySQL,但我确信有一定是更好的方法)。
我想做的是:
View ABC:
-------------------------------------------------------------
| A | B | C | D | E | F |
| | | | | | |
-------------------------------------------------------------
| data1 | asdf | 3 | 0 | 2 | 7 |
| data1 | jkl; | 1 | 1 | 0 | 0 |
| data2 | lmno | 0 | 1 | 2 | 17 |
-------------------------------------------------------------
所以我的第一个想法是在 B 字段上进行 LEFT OUTER JOIN,如下所示:
SELECT ABC.*, DEF.D, GHI.E, JKL.F
FROM ABC
LEFT OUTER JOIN DEF ON ABC.B = DEF.B
LEFT OUTER JOIN GHI ON ABC.B = GHI.B
LEFT OUTER JOIN JKL ON ABC.B = JKL.B
这一切都很好;它用 NULL 填充零,我可以轻松地将其合并为 0。但是,问题是 DEF、GHI 或 JKL View 之一中是否有一行用户名与 ABC 中的用户名不匹配;该行只是从我的 SELECT 中省略(因为这是一个 LEFT OUTER JOIN)。 RIGHT OUTER JOIN 也遇到同样的问题。
有没有办法执行完全外连接,使得四个 View 中任何一个中出现的任何 B 都将在我的 SELECT 中拥有一行?我尝试嵌入一些其他选择,但不幸的是,这似乎在 SELECT 结果中以 Not Acceptable 方式重复行和数据值。从查看文档来看,我认为 MySQL 不支持完整的外连接(至少我找不到),即使支持,我也不知道如何将用户名从其他 View 获取到SELECT 语句中的用户名列。
最佳答案
您正在寻找的内容称为 FULL OUTER JOIN 。不幸的是,MySQL 似乎不直接支持它,但是您可以通过对 LEFT JOIN
和 RIGHT JOIN
执行 UNION
来实现结果>s.
来自:http://dev.mysql.com/doc/refman/5.0/en/join.html
Posted by barbarina on September 12 2006 2:17pm
You can emulate FULL OUTER JOIN using UNION (from MySQL 4.0.0 on):
with two tables t1, t2:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id
with three tables t1, t2, t3:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id LEFT JOIN t3 ON t2.id = t3.id UNION SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id RIGHT JOIN t3 ON t2.id = t3.id
关于mysql - 组合多个 View 中的多个 SELECT 查询来统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5480793/