Если вам нужны только пользователи, я бы порекомендовал два exists
:
SELECT u.*
FROM users u
WHERE EXISTS (SELECT 1
FROM addresses a
WHERE u.temp_address_id = a.id AND a.text = 'SF'
) OR
EXISTS (SELECT 1
FROM addresses a
WHERE u.permanent_address_id = a.id AND a.text = 'MTV'
);
Это должно иметь гораздо лучшую производительность, чем OR
в предложении JOIN
, особенно с индексом на addresses(id, text)
.
Если вам требуется вернуть информацию об адресе, используйте два left join
s:
SELECT u.*, COALECE(ta.text, tp.text) as text
FROM users u LEFT JOIN
addresses ta
ON u.temp_address_id = ta.id AND
ta.text = 'SF' LEFT JOIN
addresses tp
ON u.permanent_address_id = ta.id AND
ta.text = 'MTV'
WHERE ta.id IS NOT NULL OR tp.id IS NOT NULL;
Недостатком этого подхода является то, что вам необходимо использовать COALESCE()
для каждого из столбцы, выбранные из таблицы address
.