2017-10-15 43 views
0

這裏的朋友就是我的表:只有那些不常見的兩個用戶

1):表的朋友:

id_invitation  
id_exp    
id_des  
date_invitation 
active    

2):表用戶:

id   
prenom  
nom   
email   
password  

我有兩個查詢:

1:第一個返回我的朋友列表。

SELECT * 
    FROM users U 
    JOIN friends F 
    ON (U.id = F.id_exp AND F.id_des = :id) 
    OR (U.id = F.id_des AND F.id_exp = :id) 
WHERE U.id <> :id 
    AND F.active = 1 

2:第二個只返回兩個用戶之間的共同朋友。

SELECT u.id 
    , u.nom 
    , u.prenom 
    FROM users u 
    JOIN 
    (SELECT id_exp 
      , id_des 
     FROM friends 
     WHERE id_exp IN(:id_exp, :id_des) 
      AND active = 1 
     UNION 
     SELECT id_des 
      , id_exp 
     FROM friends 
     WHERE id_des IN(:id_exp, :id_des) 
      AND active = 1 
    ) tmp 
    ON tmp.id_des = u.id 
GROUP 
    BY u.id 
HAVING COUNT(*) = 2 

小的修正:

1是2和3之間的普通朋友,因爲他是既2和3的朋友(如果你想收集在2和3的普通朋友,你將有1)。 4是朋友2但不是3。 3也是朋友5和6,我想在朋友列表中搜索2,從2中找回朋友,但不是3的朋友(在這種情況下是4)。 我想回到4只,而不是4,5,6

更多信息: 我要當的2少見朋友3次訪問列表,它看到4 我只想返回的2個朋友誰與4不友好。

我有點麻煩解釋它。

我試圖代碼:

 SELECT 
     * 
    FROM 
     users U 
      INNER JOIN friends F 
       ON (U.id = F.id_exp AND F.id_des = :id) 
       OR (U.id = F.id_des AND F.id_exp = :id) 
    WHERE 
     (U.id <> :id_k 
     AND F.active = 1) 

     AND NOT IN 
(SELECT u.id, 
     u.nom, u.prenom, u.avatar 
    FROM users u 
    INNER JOIN 
    (
     SELECT id_exp, id_des 
     FROM friends 
     WHERE id_exp IN(:id_exp, :id_des) 
     AND active = 1 
     UNION 
     SELECT id_des, id_exp 
     FROM friends 
     WHERE id_des IN(:id_exp, :id_des) 
     AND active = 1 
    ) tmp ON tmp.id_des = u.id 
    GROUP BY u.id 
    HAVING COUNT(*) = 2) 

但它不工作在最壞的情況,它產生的錯誤和網頁的問題不會出現在部分。 謝謝。

+2

請問您可以添加示例數據和預期輸出嗎? –

+1

似乎你應該將'HAVING COUNT(*)= 2'改爲'HAVING COUNT(*)= 1' ...否? –

回答

0

我相信你已經有了使用當前查詢的相互和非共同的朋友狀態所需的成分,這只是你現在如何使用它的問題。

SELECT 
     u.id 
    , u.nom 
    , u.prenom 
    , case when count(tmp.id_des) = 1 then 'Not Mutual' 
      when count(tmp.id_des) = 2 then 'Mutual' 
      when count(tmp.id_des) = 0 then 'Alone in this world' 
      else 'Undefined' 
     end as friend_status 
    FROM users u 
    JOIN 
    (SELECT id_exp 
      , id_des 
     FROM friends 
     WHERE id_exp IN(:id_exp, :id_des) 
      AND active = 1 
     UNION 
     SELECT id_des 
      , id_exp 
     FROM friends 
     WHERE id_des IN(:id_exp, :id_des) 
      AND active = 1 
    ) tmp ON tmp.id_des = u.id 
    GROUP BY 
     u.id 
    , u.nom 
    , u.prenom 
+0

我試過了你的代碼,但它返回給我一個用戶的所有朋友,而我想要一個用戶的朋友,並且這對其他 用戶不常見。 例如: 1是2和3之間的普通朋友,因爲他是2和3的朋友(如果你想收集2和3的普通朋友,你將有1)。 4是朋友2但不是3;我想恢復4作爲朋友不常見的2和3. 我希望被理解。 謝謝。 – kam

+0

我的觀點是,你已經做了你所要求的查詢'我想要一個查詢......只返回對兩個用戶不共同的朋友'你所要做的只是過濾** HAVING COUNT(* )= 1 **,並且該查詢將僅針對非共同朋友,或者如果您想要共同和不共有,則不要過濾。我添加的案例表達式不是必需的。 –

+0

小調整: 1是2和3之間的普通朋友,因爲他是2和3的朋友(如果你想收集2和3的普通朋友,你將有1)。 4是朋友2但不是3。 3也是朋友5和6,我想在朋友列表中搜索2,從2中找回朋友,但不是3的朋友(在這種情況下是4)。 我想回到4只,而不是4,5,6 更多信息: 我要當的2少見朋友3次訪問列表,它看到4 我只想返回的2個朋友是誰不如4友好。 我有點麻煩解釋它。 – kam

相關問題