【问题标题】:How to include mysql join results into a PHP multidimensional array如何将 mysql 连接结果包含到 PHP 多维数组中
【发布时间】:2017-10-25 11:16:24
【问题描述】:

我有两个名为“Accounts”和“Images”的表。

图像将包含每个帐户的多个结果。

如何在单个数组中反映与使用 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);

如果我有比使用上面的代码更好的开始方法,我愿意接受所有建议。

【问题讨论】:

  • 这不是将文件名存储在字符串中的好方法。如果其中一个文件中包含,,则会出现问题。

标签: php mysql arrays multidimensional-array


【解决方案1】:

您可以使用单个 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

【讨论】:

    【解决方案2】:

    基本上,您正在寻找一种将连接表中的多行连接成字符串的方法。有一些解决方案,但它们特定于数据库 - 您可以查看这个 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,其键与帐户 ID 匹配。如果确实需要简单的序列号作为键,请在循环后添加$accounts = array_values($accounts);

    【讨论】:

    • 谢谢你给了我以下结果。它将所有图像放在 csv 中,并且只给了我一个帐户,而不是从 sql 查询返回的所有帐户。 ` 数组 ( [0] => 数组 ( [id] => 1 [firstName] => "John" [lastName] => "Doe" [filename] => "image1.jpg,image2,jpg,image3,image4. jpg,image11.jpg,image20.jpg"))`
    • 您是否添加了array_values 电话?尝试不使用它。另请注意,我已修改查询并将a.id 添加到选定的列中。最后,如果您需要获取所有帐户,甚至包括那些没有任何图像的帐户,请将 INNER JOIN 替换为 LEFT JOIN。
    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2014-12-04
    • 1970-01-01
    • 2013-03-09
    • 2016-07-11
    • 2011-06-30
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多