Вам не нужно присоединяться дважды, сделайте это так:
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 ) )
И вот решение, которое не будет выполнять полное сканирование таблицы, если у вас есть индексы на 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 )