2016-08-25 114 views
3

我有這個疑問:MySQL的左連接與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;