-1 mysql conditional join
我想用a做以下LEFT JOIN
(请不要建议UNION ALL
)
SELECT o.*, s.col1, s.col2 FROM order o
INNER JOIN user u ON o.user_id = u.id
IF o.date less than '2011-01-01'
JOIN subscribe s ON u.key = s.key
ELSE
JOIN subscribe s ON u.email = s.email
END IF;
Run Code Online (Sandbox Code Playgroud)
我使用以下但无法测试它.
SELECT o.*, COALESCE(s1.col1,s2.col1) AS
col1, COALESCE(s1.col2, s2.col2) AS col2
FROM order o INNER JOIN user u ON o.user_id = u.id
LEFT JOIN subscribe s1 ON
(u.key LIKE (CASE o.date >= '2011-01-01 00:00:00'
WHEN TRUE THEN s1.key ELSE NULL END))
LEFT JOIN subscribe s2 ON (u.email LIKE (CASE o.date <
'2011-01-01 00:00:00' WHEN TRUE THEN s.email
ELSE NULL END));
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我.
谢谢.
你不需要加入两次,就像这样:
SELECT o.*, s.col1, s.col2
FROM order o INNER JOIN user u ON o.user_id = u.id
LEFT JOIN subscribe s ON( ( o.date < '2011-01-01' AND u.key = s.key ) OR
( o.date >= '2011-01-01' AND u.email = s.email ) )
Run Code Online (Sandbox Code Playgroud)
这里是不会做一个全表扫描,如果你有索引的解决方案subscribe.key
和subscribe.email
:
SELECT * FROM
(
( SELECT 0 AS mode, o.date AS odate, o.*, s.col1, s.col2
FROM order o INNER JOIN user u ON o.user_id = u.id
LEFT JOIN subscribe s ON( u.key = s.key ) )
UNION
( SELECT 1 AS mode, o.date AS odate, o.*, s.col1, s.col2
FROM order o INNER JOIN user u ON o.user_id = u.id
LEFT JOIN subscribe s ON( u.email = s.email ) )
)
WHERE ( odate < '2011-01-01' AND mode = 0 ) OR
( odate >= '2011-01-01' AND mode = 1 )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
465 次 |
最近记录: |