2012-01-28 58 views
2

我有你表「user_follow」,「圖像」,「用戶」選擇我和我的朋友所有的朋友,除了我們兩個SQL

我的user_id:3 我的朋友user_id說明:6

我需要查詢選擇和我所有的朋友和我的朋友用自己的用戶名的圖像 1)沒有顯示出我們彼此 2)重複的朋友顯示爲1個

我的查詢是:

$sql = "SELECT u.username, i.image, u.id 
      FROM users u 
      LEFT JOIN user_follow f ON u.id = f.follow_id 
      LEFT JOIN images i ON u.id = i.user_id 
      WHERE f.user_id = 6 OR f.user_id = 3 
      GROUP BY u.id 
      ORDER BY f.date DESC"; 

和結果是:

[user_both_follow] => Array 
    (
     [0] => Array 
      (
       [username] => Kolxoznik1 
       [image] => 
       [id] => 1 
      ) 

     [1] => Array 
      (
       [username] => 7777 
       [image] => 
       [id] => 8 
      ) 

     [2] => Array 
      (
       [username] => 6666 
       [image] => flw3utn9igiqh7dtt2o61ydf8_174.jpeg 
       [id] => 6 
      ) 

     [3] => Array 
      (
       [username] => 8888 
       [image] => 
       [id] => 7 
      ) 

    ) 

我的查詢工作在50%的IT部門一樣的朋友,但問題是,顯示我的朋友3-> 6(顯示)

回答

2

什麼是 'ID' 列對於?恕我直言主鍵應該是(user_id,follow_id).. 一個簡單的AND f.follow_id != 3 and f.follow_id != 6應該修復您的查詢。

通過可能簡化爲:

WHERE f.user_id IN(3,6) AND f.follow_id NOT IN (3,6) 

此外,您可能要(RIGHT) JOIN user_follow,而不是離開。

而且,也許MySQL是足夠聰明的優化,但我不知道是否EXPLAIN說該查詢不同的東西,然後爲:

 SELECT u.username, i.image, u.id 
     FROM user_follow f 
     JOIN users u ON u.id = f.follow_id 
     LEFT JOIN images i ON u.id = i.user_id 
     WHERE f.user_id IN(3,6) AND f.follow_id NOT IN(3,6) 
     GROUP BY u.id 
     ORDER BY f.date DESC 

足夠也許聰明,但爲何要保留查詢規劃猜測...

相關問題