2015-07-21 73 views
0

對於拒絕投票的人,請您向我解釋原因?如果這對你來說似乎微不足道,我將不勝感激地向你指出一個參考;如果這是一個重複的問題,我希望你能指出我以前的問題。謝謝!如何在這種情況下查詢兩個表?

我有兩個表,userfriend。目標如下:用戶a想要獲得另一個用戶的信息b;返回的信息取決於他們是否是朋友。具體來說,如果他們是朋友,a可以看到busernameaddress;如果沒有,a只能看到b的用戶名。

user表如下所示:

id username address 
1 abc  XXXX Rd. XXXX 
2 def  XXXX Rd. XXXX 
3 ghi  XXXX Rd. XXXX 

friend表如下所示:

id id1 id2 
1 1  2  // so 1 (abc) and 2 (def) are friends 
2 1  3  // so 1 (abc) and 3 (ghi) are friends 

2(def)和3(ghi)不是朋友。所以基本上有以下兩種情況:

  1. 用戶2(def)希望看到用戶3(ghi)的信息,查詢返回ghi的用戶名只,但沒有解決
  2. 用戶1(abc )想要查看用戶3(ghi)的信息,查詢返回ghi的用戶名和地址

是否可以使用一個查詢來完成?

+0

您是否可以爲* not-allowed *數據元素(即address)返回NULL或空字符串? –

+0

@ PM77-1,是的,這是我的目的的正確方法。 – Dainy

回答

2

您可以使用JOIN並檢查聯合用戶列是否存在(非空)以確定友誼是否存在。

E.g.如果用戶def(2)希望(3)用戶ghi信息:

SELECT 
    user.username, 
    user.address, 
    friend.id AS are_friends 
FROM user 
INNER JOIN friend 
    ON (friend.id1 = user.id AND friend.id2 = 2) 
WHERE user.id = 3; 

這應該只從你的PDO處理程序返回一行,如果用戶2和3之間的鏈接存在。如果不是,則內部連接將不起作用 - 如果您在此處使用了左連接,它將會,但會爲are_friends字段返回空值。

當然,您可以用該當前登錄用戶的ID替換該查詢中的2,並將3替換爲需要信息的用戶的ID。

+0

這是做的工作。謝謝。 – Dainy

2

你會做一個簡單的連接,但對於ADDRESS的問題,把它放在一個IF()構造中。只能抓住一個朋友。

select 
     u.username as NameOfPossibleFriend, 
     coalesce(u.Address, "not a friend") as FriendAddress 
    from 
     user u 
     LEFT JOIN friend f 
      on ( f.id1 = UserIDYourAreBasing 
       and f.id2 = IDOfPossibleFriend) 
      OR ( f.id2 = UserIDYourAreBasing 
       and f.id1 = IDOfPossibleFriend) 
    where 
     u.id = IDOfPossibleFriend 

於是,我開始與用戶帳戶明確地找你正在尋找一個可能的朋友的人的ID。至少,你知道可能的朋友的ID,並希望名稱,但有條件公開地址。

所以,現在是左加盟。由於我不知道ID1和ID2的表格結構標準始終是低/高或高/低ID,因此無法查看朋友是否可用。那是。如果用戶1和用戶3是朋友,是否有可能將記錄添加到表格中,因爲ID1 = 1和ID2 = 3,或者可能有ID1 = 3和ID2 = 1(交替次序,但結果相同。 ..用戶1 & 3是朋友)。

因此,左連接說看哪裏

ID1 is the original person and ID2 = the friend you are hoping to match. 

OR

ID1 is the friend you are hoping to match and ID2 is the original person 

因此,左連接會找到一條記錄匹配和,則ID將不爲空,該朋友的地址將被拉...如果沒有這樣的朋友匹配,則該ID將從他的朋友的加入中爲空,因此僅返回一個簡單的「不是朋友」。

+0

謝謝你的回答。 scrowler的回答爲我做了工作,所以我接受了他的工作。仍然感激你的時間! – Dainy