2017-05-24 16 views
1

我有兩個名爲「Accounts」和「Images」的表。如何將mysql連接結果包含到PHP多維數組中

圖片將包含每個帳戶的多個結果。

如何反映與使用mysql和php的賬戶相關的所有圖像在單個數組中,所有圖像以逗號分隔?

我不能肯定它加入要麼使用...

這是我希望我的最終結果是:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [firstName] => "John" 
      [lastName] => "Doe" 
      [images] => "image1.jpg,image2.jpg,image3.jpg" 
     ) 

) 

這是我目前得到:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [firstName] => "John" 
      [lastName] => "Doe" 
      [filename] => "image1.jpg" 
     ) 

) 

這是我迄今的代碼:

$sql = SELECT a.firstName,a.lastName,i.fileName FROM accounts a INNER JOIN images i ON a.id = i.accountID; 

$result = mysqli_query($con,$sql); 

while($row = mysqli_fetch_assoc($result)){ 
     $accounts[] = $row; 
} 

print_r($accounts); 

如果我有更好的方式開始使用上面的代碼,我願意接受所有建議。

+0

這不是用字符串存儲文件名的好方法。如果其中的一個文件有'','這個文件就會出問題。 – ICE

回答

4

您可以使用單個SQL查詢和GROUP_CONCAT函數完成所需的輸出。

以下將查找所有帳戶(帶和不帶圖像)以及逗號分隔的圖像文件名列表。

如果您只想查找帶有圖像的帳戶,請將LEFT JOIN更改爲INNER JOIN

SELECT a.id, a.firstName, a.lastName, GROUP_CONCAT(i.fileName SEPARATOR ',') AS images 
FROM accounts a 
LEFT JOIN images i ON (a.id = i.accountID) 
GROUP BY a.id 
1

基本上你正在尋找一種方法來將連接表中的多行連接成一個字符串。有一些解決方案,但他們是特定於數據庫 - 你可以檢查這個SO答案的靈感 - How to create a SQL Server function to "join" multiple rows from a subquery into a single delimited field?

但可能更簡單的方法是結合在PHP代碼中的結果。由於每個帳戶都會返回重複的數據,因此這會造成一些性能下降,但如果您只選擇了幾列,則這並不重要。

代碼可能是這樣的:

$sql = 'SELECT a.id,a.firstName,a.lastName,i.fileName FROM accounts a INNER JOIN images i ON a.id = i.accountID'; 

$result = mysqli_query($con,$sql); 

while($row = mysqli_fetch_assoc($result)){ 
    if (!isset($accounts[$row['id']])) { 
     $accounts[$row['id']] = $row; 
    } else { 
     $accounts[$row['id']]['fileName'] .= ',' . $row['fileName']; 
    } 
} 

print_r($accounts); 

注意,此代碼創建數組$賬戶的鑰匙匹配帳戶編號。如果您確實需要簡單的序列號作爲密鑰,請在循環後添加$accounts = array_values($accounts);

+0

謝謝,給了我以下結果。它將所有圖像放在csv中,並且只給我一個帳戶,而不是從sql查詢返回的所有帳戶。 ' 陣列 ( [0] =>數組 ( [ID] => 1 [名字] => 「約翰」 [姓氏] => 「Doe的」 [文件名] =>「image1.jpg ,image2,jpg,image3,image4.jpg,image11.jpg,image20.jpg「 ) )' – user1157800

+0

您是否添加了'array_values'調用?嘗試沒有它。另外請注意,我修改了查詢並將'a.id'添加到了選定的列。最後,如果您需要獲得所有帳戶,甚至包括那些沒有任何圖像的帳戶,請將INNER JOIN替換爲LEFT JOIN。 – astax