【发布时间】:2016-06-15 19:20:28
【问题描述】:
我正在管理一个数据库,我想知道是否有更酷的方法来进行此查询。
我的实际查询:
SELECT * FROM mytable
LEFT JOIN table1 AS m1 ON mytable.idA=m1.K
LEFT JOIN table1 AS m2 ON mytable.idB=m2.K
LEFT JOIN table1 AS m3 ON mytable.idC=m3.K
LEFT JOIN table1 AS m4 ON mytable.idD=m4.K
LEFT OUTER JOIN table2 AS t1 ON mytable.idK1= t1.idK1 AND mytable.idK2= t1.idK2
LEFT OUTER JOIN table3 ON t1.idT = table3.idT
WHERE m1.K = "my_value" OR m2.K = "my_value" OR m3.K = "my_value" OR m4.K = "my_value"
我有一个查询在同一个其他表上进行 4 次连接,因为我可以在字段 idA、idB、idC 或 idD 中获得值。 之后,我与其他表进行其他 2 个联接。
我的问题是:
我可以改进这段代码吗?有没有更聪明的方法或更好的逻辑可以遵循?
非常感谢,即使是理论上的解释。
【问题讨论】:
-
你的表格有正确的索引吗?
-
我会 (1) 确保索引 idA 等,并且 (2) 与
ON idA=K OR idB=K OR idC=K OR idD=K进行一次联接,这不是完全相同的登录,但可以做你想做的事。想想吧。 -
并按名称调用列。 * 太贵了
-
你对
idA,idB,idC,idD的值做了什么? -
通过
WHERE子句将INNER JOINs 转换为INNER JOINs,你正在扼杀你的LEFT JOINs。这与您的表现无关,但您的查询没有在做您认为它正在做的事情。