0

我有以下通过 PHP 运行的查询:

select 
    {$tableProducts}.*,
    {$tableImages}.*
from {$tableProducts}
left join {$tableImages}
    on {$tableImages}.product_id = {$tableProducts}.product_id
group by {$tableProducts}.product_id;

每个产品(来自产品表)可以有多个图像(在图像表中)。我用一个简单的 while 语句遍历结果:

while($row = $results->fetch_object()) {
    echo $row->product_name; // Product table
    echo $row->image_src; // Image table
}

问题:只打印每个产品的第一个图像,但我想显示所有图像。如果我删除“order by”部分,则会打印所有图像,但随后会为每个图像打印一次 product_name(因此,如果一个产品具有三个图像,那么 product_name 也将打印 3 次)。

我如何最好地解决这个问题?

4

1 回答 1

1

就是这样GROUP BY工作的。

如果您想获取所有产品的所有图像,您可以(至少)通过 3 种方式来解决:

1:不要使用GROUP BY,在循环中处理,比如:

$last_product = null;
while($row = $results->fetch_object()) {
    if ($last_product !== $row->product_id) {
        // new product starts here
        $last_product = $row->product_id;
        echo $row->product_name; // Product table
    }
    echo $row->image_src; // Image table
}

2GROUP BY在循环中使用和查询所有具有不同语句的图像。

$products = <query products>;

while($row = $products->fetch_object()) {
    echo $row->product_name; // Product table

    $images = <query images for product in $row>;
    while($row = $images->fetch_object()) {
        echo $row->image_src; // Image table
    }
}

3:使用聚合字符串函数获取产品的所有图像。这仅在特殊情况下有效,f.ex。在这里,例如 URL 不能包含新行。

MySQL

select 
    {$tableProducts}.*,
    group_concat({$tableImages}.image_src SEPARATOR '\n') as image_srcs
from {$tableProducts}
left join {$tableImages}
    on {$tableImages}.product_id = {$tableProducts}.product_id
group by {$tableProducts}.product_id;

PostgreSQL

select 
    {$tableProducts}.*,
    string_agg({$tableImages}.image_src, '\n') as image_srcs
from {$tableProducts}
left join {$tableImages}
    on {$tableImages}.product_id = {$tableProducts}.product_id
group by {$tableProducts}.product_id;

在循环:

while($row = $products->fetch_object()) {
    echo $row->product_name; // Product table
    foreach (explode("\n", $row->image_srcs) as $image_src) {
        echo $image_src; // Image table
    }
}
于 2013-05-16T12:36:39.943 回答