【发布时间】:2017-09-13 14:42:16
【问题描述】:
我对 SQL 和 MySQL 非常陌生。我发现自联接是一种比较“x”的方法,其中 A 列相同,例如
表 1:
id colA x
-----------------
1 q1 0.1
1 q2 0.5
1 q3 0.7
2 q1 0.4
2 q2 0.9
2 q3 1.3
3 q1 0.2
3 q2 0.4
3 q3 0.1
查询:
select a.`colA`, a.`x`, b.`x`, c.`x`
from `tab1` as a
join `tab1` as b on a.`colA` = b.`colA`
join `tab1` as c on a.`colA` = c.`colA`
where a.`id` = 1 and b.`id` = 2 and c.`id` = 3
给我:
colA x x x
q1 0.1 0.4 0.2
q2 0.5 0.9 0.4
q3 0.7 1.3 0.1
太棒了!我还刚刚发现 MySQL 不能进行完全外连接,因此使用左、右或普通旧连接将为我提供 MINIMUM 行,即如果 id 缺少任何 colA 值,那么它们将完全从结果中丢失,事实上,如果我在上面的任何 id 中去掉 q1 和 q2,我会得到一行。
q3 0.7 1.3 0.1
我已经看到了很多关于如何使用 UNION / UNION ALL 来模拟完全外部联接的链接,我可以使用 frankenstein 来模拟这些链接,但这些链接并不能作为一个很好的比较表给我提供结果。有没有更简单的方法可以在 SELF 连接期间告诉查询不要忽略空值?我觉得这应该很容易,但我已经摸不着头脑了几个小时,并且在谷歌上搜索了很多答案,我认为我看不到树林,因为所有的树木。
【问题讨论】:
-
MySQL pivot table 的可能副本,如果需要动态:stackoverflow.com/questions/12004603/…
-
内连接、左连接、全连接、联合、限制等是表上的运算符。查询是一个表达式树。将查询视为运算符的变体是没有帮助的,也许它恰好位于树的顶部,其中一棵树提供了您想要的东西。您需要考虑如何将输入转换为输出。在这里,您没有解释您的查询应该返回什么。您的“给我最小行数”不清楚,您对 do 想要什么的描述也不是很清楚。 (这似乎是三个左连接的内连接。)请阅读minimal reproducible example 并采取行动。