2016-08-25 6 views
3

У меня есть этот запрос:MySQL LEFT JOIN с IF

SELECT r.*, d.rateName 
FROM ratings r 
LEFT JOIN rate_data d ON (r.rateID=d.rateID AND d.rateName != '') 
ORDER BY r.rateTime DESC 

Эта работа отлично. Теперь у меня есть вторая таблица данных. Дайте изменение, чтобы сделать это с IF в одном запросе или это единственный способ сделать два запроса и слить результат?

Я пытаюсь показать вам, что я имею в виду:

SELECT r.*, d.rateName 
FROM ratings r 
(IF r.isOther == 0)LEFT JOIN rate_data d ON (r.rateID=d.rateID AND d.rateName != '') 
(ELSEIF r.isOther == 1)LEFT JOIN rate_data_other d ON (r.rateOtherID=d.rateOtherID AND d.rateName != '') 
ORDER BY r.rateTime DESC 

Спасибо за помощь

+0

Просто используйте союз: SELECT * FROM ( \t (SELECT r.*, d.rateName \t FROM ratings r LEFT JOIN rate_data d ON (r.rateID=d.rateID AND d.rateName != '') WHERE r.isOther = 0) UNION ( SELECT r.*, d.rateName \t FROM ratings r \t LEFT JOIN rate_data_other d ON (r.rateOtherID=d.rateOtherID AND d.rateName != '') \t \t WHERE r.isOther = 1) \t \t) TMP ORDER BY TMP.rateTime DESC

ответ

3
SELECT r.*, IF(r.isOther,do.rateName,d.rateName) 
FROM ratings r 
LEFT JOIN rate_data d ON (r.rateID = d.rateID AND d.rateName != '') 
LEFT JOIN rate_data_other do ON (r.rateOtherID = do.rateOtherID AND do.rateName != '') 
ORDER BY r.rateTime DESC; 

Или

SELECT r.*, 
(CASE 
WHEN r.isOther = 0 THEN d.rateName 
ELSE do.rateName 
END) as rateName 
FROM ratings r 
LEFT JOIN rate_data d ON (r.rateID = d.rateID AND d.rateName != '') 
LEFT JOIN rate_data_other do ON (r.rateOtherID = do.rateOtherID AND do.rateName != '') 
ORDER BY r.rateTime DESC;