2011-06-04 66 views
5

正如您在下面看到的,我正在檢查當前用戶是否在user_auser_b列的表朋友的列中。MySQL Conditional Join

根據當前用戶的位置,我想獲得他的相應朋友。

不知怎的,我不能讓這個語法的工作,不知道如果有人能告訴我什麼是錯的(我得到的第3行錯誤附近IF user_a = 2

SELECT * 
    FROM friends 
IF user_a = 2 THEN 
    JOIN user_profiles ON friends.user_b = user.profiles.user_id 
WHERE user_a = 2 
    AND accepted = 1; 
ELSEIF user_b = 2 THEN 
    JOIN user_profiles ON friends.user_a = user_profiles.user_id 
WHERE user_b = 2 
    AND accepted = 1; 
END IF; 
+0

確定它似乎有一個共識,這是一些crapshot MySQL代碼 - 沒有任何人有我一個建議/路線圖,以實現我想要的結果? – pepe 2011-06-04 03:01:01

+0

如果你解釋你實際上想要完成的事情,那將會更容易。 – dkamins 2011-06-04 03:06:21

+0

你可以用UNION做......看到我的答案。 – 2011-06-04 03:14:09

回答

8

您可以使用UNION做到這一點:

select f.*, up_a.* from friends f 
    inner join user_profiles up_a on f.user_a=up_a.user_id 
    where f.user_b=2 and f.accepted=1 
union 
select f.*, up_b.* from friends f 
    inner join user_profiles up_b on f.user_b=up_b.user_id 
    where f.user_a=2 and f.accepted=1; 
+0

@AJ - 很好,這個效果很好 - @AJ你可以編輯你的響應添加行和第7行中的AND接受= 1嗎?那fullfils我原來的問題,並允許我的查詢來過濾友誼仍然懸而未決(即接受= 0) - 非常感謝 – pepe 2011-06-04 03:25:03

+0

@torr - 完成,對不起,我錯過了!祝你好運。 – 2011-06-04 03:29:43

0

我相信你試圖語法我不認爲你可以使用IF條件來以這種方式分支你的SQL語句,也許可以將它合併到SELECT CASE

如果你可以使用局部變量,沿着這些行可能工作:

BEGIN 
SELECT user_a, user_b INTO local_a, local_b FROM friends; 

IF local_a = 2 THEN 
    SELECT * FROM friends JOIN user_profiles ON friends.user_b = users.profiles.user_id 
    WHERE user_a = 2 AND accepted = 1; 
ELSEIF user_b = 2 THEN 
    SELECT * FROM friends JOIN user_profiles ON friends.user_b = users.profiles.user_id 
    WHERE user_b = 2 AND accepted = 1 
END IF; 
END; 

我也不確定這個有效性,但它可能會讓你走上正確的道路。另請參閱:http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

+0

你的意思是在'JOIN'和'WHERE'裏面使用'IF'嗎? – pepe 2011-06-04 02:56:24

+0

@torr是的我的意思是在'SELECT'語句中的任何地方使用'IF',並期望它動態地構造一個完整有效的SQL語句。 – 2011-06-04 02:58:25