2017-05-24 38 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