如何使用主查询中的LEFT JOIN和子查询中的INNER JOIN优化MySQL SELECT查询?

梅兰

考虑有三个表:ABC和下面的简单查询:

SELECT *
FROM A
LEFT JOIN (
    SELECT *
    FROM B
    INNER JOIN C ON (B.bid = C.bfid)
) s ON (A.bfid = s.bid)

如果子查询选择的行太多,这个查询将是一个拖累,因为MySQL不会使用任何索引A.bfid = s.bid如果有多个子查询,则这种情况会变得更糟。

有谁知道如何优化这种情况?

这是表结构和示例数据:

CREATE TABLE A (aid INT, bfid INT, PRIMARY KEY (aid));
CREATE TABLE B (bid INT, PRIMARY KEY (bid));
CREATE TABLE C (cid INT, bfid int, PRIMARY KEY (cid));

INSERT INTO B VALUES (1), (2), (3);
INSERT INTO A VALUES (4, 1), (5, 2);
INSERT INTO C VALUES (6, 2), (7, 3);

有了这些,查询将输出:

+-----+------+------+------+------+
| aid | bfid | bid  | cid  | bfid |
+-----+------+------+------+------+
|   4 |    1 | NULL | NULL | NULL |
|   5 |    2 |    2 |    6 |    2 |
+-----+------+------+------+------+
启动

一种可行的方法是使用一对LEFT联接,然后根据是否在C:-上找到匹配项来确定是否返回B.adid。

SELECT A.*, 
    IF(C.bfid IS NULL, NULL, B.bid), 
    IF(C.bfid IS NULL, NULL, C.cid), 
    IF(C.bfid IS NULL, NULL, C.bfid)
FROM A
LEFT OUTER JOIN B ON A.bfid = B.bid
LEFT OUTER JOIN C ON B.bid = C.bfid

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

INNER JOIN与mysql中的max和where子句的子查询

来自分类Dev

INNER JOIN(MySQL)中的子查询

来自分类Dev

MySQL优化使查询NOT IN复杂化(在2 SELECT WITH JOIN中)

来自分类Dev

子查询 SQL 中的 INNER JOIN

来自分类Dev

使用INNER JOIN和LEFT JOIN的MySQL查询

来自分类Dev

优化INNER JOIN查询性能

来自分类Dev

mysql INNER_JOIN子查询

来自分类Dev

mysql INNER_JOIN子查询

来自分类Dev

MySQL JOIN LIMIT动态查询优化

来自分类Dev

MySQL查询INNER JOIN

来自分类Dev

优化Join、Sum、子查询

来自分类Dev

子查询还是INNER JOIN?

来自分类Dev

使用LEFT JOIN(SELECT)ORDER和LIMIT的MySQL查询

来自分类Dev

如何使用带有子查询的join优化查询?

来自分类Dev

MySQL子查询JOIN

来自分类Dev

Mysql JOIN子查询

来自分类Dev

MySQL查询Select,SUM,LEFT JOIN

来自分类Dev

MySQL查询Select,SUM,LEFT JOIN

来自分类Dev

Django如何在LEFT JOIN中传递子查询

来自分类Dev

所有包含EXISTS子查询和ON的LEFT JOIN的MySQL SELECT查询的问题,其中ON引用了外部SELECT

来自分类Dev

查询中的 SUM、GROUP BY 和 LEFT JOIN

来自分类Dev

MySQL查询INNER JOIN与别名

来自分类Dev

使用 Left Join 的 SQL 查询中的问题

来自分类Dev

MySQL,如何在SELECT查询中引用子查询字段

来自分类Dev

MySQL INNER JOIN 带有子查询和最大日期的空行

来自分类Dev

MySQL优化使查询不复杂(2 SELECT WITH JOIN)在哪里复杂化

来自分类Dev

多个INNER JOIN子查询sql

来自分类Dev

Postgres中的LEFT JOIN查询

来自分类Dev

如何编写从LEFT JOIN结果中减去INNER JOIN结果的SQL查询?