[英]Mysql LEFT JOIN gives me result, RIGHT JOIN NOT also INNER JOIN
[英]LEFT JOIN in MySQL gives same result as INNER or RIGHT JOIN
在以下查询中,我将加入一个具有45324个项目的样本表。 结果只给我39426个,并且没有一个包含空SUM,SUM_YIELD或任何其他内容。有人可以解释为什么LEFT,RIGHT和INNER JOIN给我相同的结果吗?
SELECT
`gs_prod`.`samples`.`id` AS `id`,
`gs_prod`.`samples`.`customer_name` AS `customer_name`,
`qcs_demux_stats_view`.`sample_name` AS `sample_name`,
FORMAT(
SUM(`qcs_demux_stats_view`.`clusters`),
0
) AS `SUM`,
FORMAT(
SUM(`qcs_demux_stats_view`.`yield`),
0
) AS `SUM_YIELD`,
ROUND(
(
SUM(
(
`qcs_demux_stats_view`.`perc_q30` * `qcs_demux_stats_view`.`clusters`
)
) / SUM(`qcs_demux_stats_view`.`clusters`)
),
2
) AS `perc_q30`
FROM
(
`gs_prod`.`qcs_demux_stats_view`
JOIN
`gs_prod`.`samples` ON(
(
`gs_prod`.`samples`.`id` = `qcs_demux_stats_view`.`sample_id`
)
)
)
WHERE
(
`qcs_demux_stats_view`.`parent_id` IN(
SELECT
`gs_prod`.`qcs`.`id`
FROM
`gs_prod`.`qcs`
WHERE
(
(`gs_prod`.`qcs`.`status` = 1) AND(
`gs_prod`.`qcs`.`deleted` = 0
)
)
) AND(
`qcs_demux_stats_view`.`status` = 1
)
)
GROUP BY
`gs_prod`.`samples`.`id`,
`qcs_demux_stats_view`.`sample_name`,
`gs_prod`.`samples`.`customer_name`
所以我得到这样的结果:
id customer_name sample_name SUM SUM_YIELD perc_q30
41453 103312-001-005-BC105 103312-001-005-BC105 7 0 88.27
41485 103312-001-005-BC137 103312-001-005-BC137 285 0 93.31
41517 103312-001-005-BC169 103312-001-005-BC169 270 0 91.46
但也希望有这样的行(其中qcs_demux_stats中没有数据):
41517 103312-001-005-BC169 103312-001-005-BC169 0 0 NaN
左边的3列来自样本表,第一个是与ON子句中匹配的ID,右边的3列是来自qcs_demux_stats表的分组数据。
WHERE子句中的条件要求qcs_demux_stats_view
非NULL,这将导致OUTER qcs_demux_stats_view
等效于INNER qcs_demux_stats_view
。
一种思考OUTER联接功能的方式,其运行方式...
当找不到匹配的行时,查询将生成一个由所有NULL值组成的虚拟行。 该虚拟的“匹配”行允许返回该行。
如果我们要求虚拟行中的列不为NULL,则该行将被排除。 从本质上讲,这将排除所有生成的虚拟行。 渲染结果等同于内部联接。
要获取外部联接结果,请执行以下任一操作:
更改WHERE子句中的条件以允许返回NULL值
要么
将这些条件重新定位到OUTER连接的ON子句
我建议将驱动表放在左侧,并将查询写为LEFT
外部联接。 (最好将RIGHT
外连接作为学术练习。)
SELECT s.`id` AS `id`
, s.`customer_name` AS `customer_name`
, v.`sample_name` AS `sample_name`
, FORMAT( SUM(v.`clusters`) ,0) AS `SUM`
, FORMAT( SUM(v.`yield`) ,0) AS `SUM_YIELD`
, ROUND( SUM( v.`perc_q30` * v.`clusters` )
/ SUM( v.`clusters` )
,2
) AS `perc_q30`
FROM `gs_prod`.`samples` s
LEFT
JOIN `gs_prod`.`qcs_demux_stats_view` v
ON v.`sample_id` = s.`id`
AND v.`parent_id` IN ( SELECT q.`id`
FROM `gs_prod`.`qcs` q
WHERE q.`status` = 1
AND q.`deleted` = 0
)
AND v.`status` = 1
GROUP
BY s.`id`
, v.`sample_name`
, s.`customer_name`
这实际上是说,让我从samples
获取所有行,以及从qcs_demux_stats_view
获得的所有匹配行。
如果在qcs_demux_stats_view
找到mo匹配行,则从samples
(左侧的驱动表)返回该行。对于这些行, qcs_demux_stats_view
中的列的值将为NULL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.