2012-07-07 61 views
0

目前,我有兩個MySQL表。MySQL如何通過JOIN獲取更多信息?

第一張表存儲朋友和他的照片之間的關係。

表1

id | pic_id | friend_id 
---------------------------- 
0 | 123  | 84589 
1 | 290  | 11390 
2 | 884  | 84589 
3 | 456  | 84589 
4 | 123  | 11111 
5 | 456  | 22222 

表2

二表存儲有關的PI​​C的詳細信息...

id | pic_id | title | color | detail 
---------------------------------------------- 
0 | 123  | hello | black | brush 
1 | 124  | world | red | paint 
2 | 884  | sample | green | star 

我使用JOIN搶我需要的信息...

但是如果我想使用與上面的SQL匹配的pic_id,並且找到其他friend_id的pic_id相同嗎?

例如,上面的SQL命令會給我第0,第2和第3行的pic_id的123,884,456。我應該使用什麼SQL命令循環這些pic_id並獲取關聯的friend_id?我想結束與11111 pic_id 123和22222 pic_id 456.

我已經使用下面的代碼來完成上述。它看起來效率不高,但速度很慢。

$sql = "SELECT b.title, b.color, b.detail 
FROM table1 a INNER JOIN table2 b 
on a.pic_id = b.pic_id 
WHERE friend_id = 84589"; 

$res = mysqli_query($link,$sql); 
    if($res){ 
     while ($rec = mysqli_fetch_assoc($res)){ 
      $pic_id.=$rec['pic_id'].","; 
      $arr[] = $rec; 
     } 
    } 

$each_id = explode(',',$pic_id); 
    foreach($each_id as $key => $value){ 
     if ($value){ 
      $next_sql = "SELECT friend_id FROM table1 WHERE pic_id=".$value; 
      $next_res = mysqli_query($link,$next_sql); 

      if ($next_res){ 
       while($next_rec = mysqli_fetch_assoc($next_res)){ 
        //do things 
       } 
      } 
     } 
    }  

對不起,如果這不清楚。請讓我知道,我會澄清。

非常感謝所有幫助!

+0

風格的筆記(以及比風格更合理一點...)。您正在創建一個逗號分隔的pic_ids列表,就像您要在IN()子句中使用它們一樣,但只是將它們分解並隨後運行一個查詢;在一個循環內......通常,循環內的任何查詢都是巨大的紅旗(即你來這裏是正確的;-)。作爲一個細節,你應該在構建一個數組時創建一個列表(然後使用implode()爲IN()子句創建一個字符串;但是你會在答案中找到更好的建議:-) – 2012-07-07 03:07:37

+0

你的提示!你知道的越多... – 2012-07-07 03:42:27

回答

2

試試這個(更新):

SELECT a.friend_id, a.pic_id 
FROM table1 a 
    WHERE EXISTS (SELECT 1 FROM table1 t 
      WHERE t.pic_id = a.pic_id AND t.friend_id = 84589) 

檢查這一點 - http://sqlfiddle.com/#!3/91cdf/3

+0

謝謝你的建議,但MySQL查詢沒有返回:( – 2012-07-07 03:42:06

+0

更新的查詢,請檢查sqlfiddle的結果 – 2012-07-07 18:23:13

0

我認爲你可以得到你想要與您現有的連接前自聯接什麼。此查詢將返回共享圖片的friend_ids的逗號分隔列表。

SELECT 
    pic_detail.title, 
    pic_detail.color, 
    pic_detail.detail, 
    GROUP_CONCAT(friend_pics.friend_id) as friend_ids 
FROM table1 as root_pics 
JOIN table1 as freind_pics 
    USING(pic_id) 
JOIN table2 as pic_details 
    ON root_pics.pic_id = pic_details.pic_id OR friend_pics.pic_id = pic_details.pic_id 
WHERE friend_id = 84589 
GROUP BY pic_detail.pic_id