是否可以以某种方式存储mysql子查询,如果它将再次用作子查询?据推测,这将产生更清晰的代码以及节省解析开销.
例如,在以下外部联接中
SELECT * FROM t1
LEFT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)
不重复会很好(SELECT * FROM t2 WHERE t2.foo=='bar').
当然这样做
SET @condition := (SELECT * FROM t2 WHERE t2.foo=='bar');
SELECT * FROM t1
LEFT JOIN (@condition) ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN (@condition) ON t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)
不,你不能。如果MySQL具有CTE(公用表表达式),则可以使用以下命令:
WITH tmp AS
(SELECT * FROM t2 WHERE t2.foo = 'bar')
SELECT * FROM t1
LEFT JOIN tmp ON t1.id = tmp.id
UNION
SELECT * FROM t1
RIGHT JOIN tmp ON t1.id = tmp.id
Run Code Online (Sandbox Code Playgroud)
如果MySQL有FULL JOIN(可惜,那也没有!),您可以使用以下代码:
SELECT * FROM t1
FULL JOIN (SELECT * FROM t2 WHERE t2.foo = 'bar') tmp
ON t1.id = tmp.id
Run Code Online (Sandbox Code Playgroud)