2010-03-08 45 views
2

對不起,標題不是很清楚。這是我之前問題的後續行動,其中一位成員幫助我進行查詢。Sql查詢 - 選擇用戶可以是朋友和用戶的行

我有以下的朋友表

朋友
friend_id - 主鍵
USER_ID
user_id_friend
狀態

的方式填充該表是 - 當我送朋友請求約翰 - 我的userID出現在user_id中,Johns userID出現在user_id_friend中。

現在,另一種情況是說,邁克向我發送好友請求 - 在這種情況下,邁克的用戶ID將出現在USER_ID和我的用戶ID將出現在user_id_friend

因此,要找到我所有的朋友 - 我需要運行一個查詢找到我的userID出現在user_id列以及user_id_friend列中的位置

我現在想要做的是 - 當我搜索用戶時說約翰 - 我希望列出的所有用戶約翰在我的網站上顯示出來他們是否是我的朋友的狀態,如果他們不是 - 然後顯示「添加朋友」按鈕。

基於以前的帖子 - 我得到這個查詢該做的工作的一部分 - 我的例子user_id是1:

 
SELECT u.user_id, f.status 
FROM user u 
LEFT OUTER JOIN friend f ON f.user_id = u.user_id and f.user_id_friend = 1 
where u.name like '%' 

所以這隻能說明用戶與他們我在哪裏,他們送我要求的朋友即我的用戶ID出現在user_id_friend中。
雖然我與其他人(在我的用戶ID出現在user_id列)的朋友 - 這個查詢將返回爲空

得到這些,我需要這樣的

 
SELECT u.user_id, f.status 
FROM user u 
LEFT OUTER JOIN friend f ON f.user_id_friend = u.user_id and f.user_id = 1 
where u.name like '%' 

那麼另一個查詢我怎麼組合這些查詢返回一組用戶以及我與他們的友誼狀態。我希望我的問題是清楚的

感謝

+0

@Gubloo,無恥的插件,但你有沒有嘗試過我發佈的查詢作爲你之前問題的答案? – 2010-03-08 13:45:35

+0

是的列文 - 我嘗試了你的查詢 - 它適用於我的userID會出現在user_id列中的1個情況 - 但是它出現在user_id_friend列中的地方 - 它會失敗。我不知道如何改變它,使它適用於這兩種情況。 - 謝謝 – Gublooo 2010-03-08 15:27:39

回答

1

結果你需要加入你的朋友表兩次:

select u.user_id, f1.status, f2.status 
from user u left outer join friend f1 on f1.user_id = u.user_id and f1.user_friend_id = 1 
      left outer join friend f2 on f2.user_friend_id = u.user_id and f2.user_id = 1 
where u.name like '%' 

第一個狀態應該顯示讓你成爲朋友的人,第二種狀態應該顯示你是朋友的人。不知道這將如何幫助你找到誰是朋友的朋友,儘管...

+0

謝謝TMN - 好消息是我不需要現在知道朋友的朋友:) - 所以從你的查詢中,如果狀態1和狀態2都爲空 - 這意味着用戶不是我的朋友,如果他們中的任何一個人的值爲1 - 這意味着他們是我的朋友 - 這會起作用 - 非常感謝 – Gublooo 2010-03-08 15:01:57

0

以合併這兩個查詢最簡單的方法是通過執行聯合:

SELECT u.user_id, f.status 
FROM user u 
LEFT OUTER JOIN friend f ON f.user_id = u.user_id and f.user_id_friend = 1 
where u.name like '%' 
UNION 
SELECT u.user_id, f.status 
FROM user u 
LEFT OUTER JOIN friend f ON f.user_id_friend = u.user_id and f.user_id = 1 
where u.name like '%' 

會產生想要

+0

其實它不是 在我的示例數據中,只有9個用戶。兩個查詢獨立運行時產生9行,部分正確的數據 - 但是當我們將它們與union結合時 - 它們產生15行,並且它們不會處理這個問題
例如,user_id 7是我的朋友 - 第一個查詢將返回狀態爲1,第二個查詢將返回空狀態,如果聯合查詢返回2行1狀態爲1,另一個狀態爲空 – Gublooo 2010-03-08 13:23:31

+0

對不起,狀態是不相關的。我想如果你從查詢中拿出這個結果,你的結果將是正確的。聯盟分散結果行 – 2010-03-08 15:24:03

+0

嗯不知道 - 如果我們拿出狀態 - 那麼它會列出所有的用戶 - 我們如何知道誰是朋友,誰不是 – Gublooo 2010-03-08 16:49:57

0

這是我目前使用 - 2個查詢的工會 - 都寫在Zend框架,但相當直截了當查看SQL:

 
$select1 = $this->select()    
     ->from(array('f'=>'friend'), array('user_id_friend as friends_id')) 
       ->where('user_id='.(int)$user_id)    
     ->where('status = 1'); 

$select2 = $this->select()    
      ->from(array('f'=>'friend'), array('user_id as friends_id'))   
      ->where('user_id_friend='.(int)$user_id)    
      ->where('status = 1');  

$select = $this->getAdapter()->select()->union(array('('.$select1.')', '('.$select2.')')); 

$stmt = $select->query(); 
return $stmt->fetchAll(); 

希望這有助於

相關問題