2014-07-26 104 views
0

加入的3表我有以下3個表:UsersFriendship & LocationSQL基於兩列

我需要寫的查詢,其中通過數據從基於用戶標識的所有3臺拉。

enter image description here

enter image description here

我覺得這裏的技巧是,你必須根據從友誼表,即用戶名和friendid兩列(所以無論是對方的朋友)來提取數據,並在此基礎上用戶的朋友列表你需要,你需要相應地拉他的朋友的名字,電子郵件和位置。

我已經寫了一些查詢使用連接,但不能得到我需要如上所述。

任何幫助將非常感激。

+0

嘿,你的問題和我的一樣嗎? :http://stackoverflow.com/questions/25015124/datatables-searching-at-server-side-php-mysql ..你有解決方案嗎? – user3209031

回答

1
select f.id as friendshipid, 
     f.userid, 
     f.friendid, 
     u.name, 
     u.email, 
     l.location 
    from (select id, userid, friendid 
      from friendship 
     union all 
     select id, friendid, userid 
      from friendship) f 
    left join location l 
    on f.friendid = l.userid 
    left join users u 
    on f.friendid = u.id 
where f.userid = 2 

這裏你可以看到一個小提琴測試:http://sqlfiddle.com/#!6/8eba4/13/0

我用反轉友誼表,並連接回表本身與工會線視圖,這樣的查詢看到的友誼在兩個方向,因爲它們只存儲在一個方向上。

+0

非常感謝Brian的快速反應。 我已經走了很遠,不幸的是這不適合我。 如果我喂用戶ID = 1以上查詢工作完美。 如果我提供userid = 2,則不返回任何內容。 –

+0

@Mubi先生我相信我已經修復了它,請參閱新的小提琴和sql。 –

+0

@Brain再次感謝,我已經嘗試過。對於userid = 1和2,它會得到相同的結果。所以基本上第一個查詢對於userid = 1工作正常,對於userid = 2工作正常。我需要兩個工作正常的查詢。或者可能有限制,需要更改db的結構。但我想知道是否有解決方案如何將朋友列表保存在數據庫中。我不覺得有一個友誼的2條記錄是合適的。就好像用戶jim向jay發送請求並且都是朋友一樣,它應該保存在單個記錄中?有什麼想法嗎? –

0

如果您一次只提取一個ID,則可以在不進行子查詢的情況下執行此操作。

SELECT friendship.id FriendshipID 
, @SearchedID UserID 
, users.id FriendID 
, users.name Name 
, users.email Email 
, location.location Location 
FROM friendship 
INNER JOIN users 
    ON friendship.userid = users.id 
    OR friendship.friendid = users.id 
INNER JOIN location 
    ON users.id = location.userid 
WHERE 
    users.id <> @SearchedID 
    AND (friendship.userid = @SearchedID OR friendship.friendid = @SearchedID);