2012-07-12 33 views
0

我想在用戶搜索結果中顯示他們的照片。不僅頭像照片,但3張照片。照片在額外的表user_photos中。如果我得到單行每個用戶的答案將是明確的 - 內部加入。但是我會爲每個用戶獲得多行。每個結果的子查詢或使用php循環或內部連接...?

我可以用第一種方法是加入:

SELECT * FROM users INNER JOIN photos ON photos.user_id=users.user_id 

在這種情況下,我需要一些額外的PHP代碼合併與同USER_ID結果。是這樣的:

foreach($results as $result){ 
    if(isset($user[$result['user_id']]['age'])){ 
    $user[$result['user_id']]['photos'][] = $result['photo']; 
    continue; 
    }  
    $user[$result['user_id']]['age'] = $result['age']; 
    $user[$result['user_id']]['photos'][] = $result['photo']; 
    //... 
} 

如果是視圖我需要爲用戶第一第一級循環,然後用於$用戶[$結果[「USER_ID」]] [「照片」]陣列中的每個用戶第二級環路。

或我可以用於每個結果子查詢。沒有任何選擇看起來優雅,所以我想知道是否有其他方式。如果不是,可能第一個選擇是一種方法,對嗎?

+0

這是什麼意思段:用同樣的USER_ID等領域,_merge結果**照片除外** ..._ – hjpotter92 2012-07-12 08:15:01

+0

我以更好的方式進行說明。 – JohnyFree 2012-07-12 08:27:17

回答

1

你想用GROUP_CONCAT,所以你會得到這樣的事情:

select u.*, group_concat(photos.name SEPARATOR ' & ') as photonames 
from users u 
    join photos on photos.user_id=users.user_id 
group by a.user_id; 

然後,你可以簡單地使用explode()解壓陣列。

1

儘管您不止一次檢索用戶數據(它會針對每個匹配的圖像返回),但第一個選項是要走的路,它比第二個選項更有效。

第二種方法效率極低,因爲它使數據庫有更多的工作要做,以及非常嚴重地增加腳本和數據庫之間的流量。

其實是有,我以前已經證明可以在這樣的情況下實現的第三個選擇,就是用GROUP BYGROUP_CONCAT()的照片信息轉換爲標量值表示可以在PHP解碼矢量(我過去曾使用過JSON)但我不能說我會推薦它,但如果你願意,我會說明它。

2

對於您的原始問題,第一個選項通常是要減少不必要地發送到數據庫的查詢數量的方法。

但是,我更喜歡Dows的答案,這幾乎就是我的想法。在一個變化我會做會使得加入LEFT JOIN讓誰沒有照片在查詢結果中仍會返回,所以在更新自己的查詢用戶:

select u.*, group_concat(photos.name SEPARATOR ' & ') as name 
from users u 
    join photos on photos.user_id=u.user_id 
group by u.user_id; 

將返回沿線結果的:

+-------------------------------------+ 
|user_id |photo      | 
+----------+--------------------------+ 
|1   |photo1 & photo2 & photo7 | 
+----------+--------------------------+ 
|2   |      NULL| 
+----------+--------------------------+ 
|3   |photo3 & photo5   | 
+-------------------------------------+