2

我有两张桌子。每个产品可以有一个或多个文件。但是每个文件必须属于一个产品。

**PRODUCTS**
ID     PRODUCT_CODE     DESCRIPTION
1      a1               small
2      a2               big

**PRODUCT_FILES**
ID     PRODUCT_ID       FILE_PATH     FILE_NAME
1      1                x.pdf         x
2      1                y.pdf         y
3      2                z.pdf         z

我想要一张桌子,其中包括

PRODUCT_ID, PRODUCT_CODE, DESCRIPTION, FILE_NAME(s), FILE PATH(s)

我的查询是;

$query = $this->db->query
("
    SELECT products.*,product_files.file_name
    FROM products 
    INNER JOIN product_files 
    ON products.id = product_files.product_id
    GROUP BY products.id
");

$i = 0;

while($row = $query->fetch_assoc())
{           
$details[]  = array
(
    'code' => $row['code'], 
    'description' => $row['description'],
    'file_name' => $row['file_name'],
    'file_path' => $row['file_path']
);
}

return $details;

我的php是;

<?php foreach($details  AS $product) { ?>
<tr>    
     <td><?php echo $product['code']; ?></td>
     <td><?php echo $product['description']; ?></td>
     <td><a href="files/<?php echo $product['file_path']; ?>">
     <?php echo $product['file_name']; ?></a></td>
</tr>
<?php } ?>

但是使用此查询和 php,产品行会复制哪个产品具有多个文件,例如;

a1   small   x   x.pdf
a1   small   y   y.pdf
a2   big     z   z.pdf

而不是我尝试使用相同的php代码进行另一个查询;

$query = $this->db->query
("
SELECT products.*,
GROUP_CONCAT(DISTINCT product_files.file_name SEPARATOR ',') 
AS file_name,product_files.file_path
FROM products 
INNER JOIN product_files 
ON products.id = product_files.product_id
GROUP BY product.id
");

结果是;

a1   small   x,y   x.pdf,y.pdf (linked with x.pdf's path)
a2   big     z     z.pdf

我现在必须分解 product_files 单元格吗?如果是,请尝试用一段代码解释一下?

4

1 回答 1

0

看起来你快到了!

你也只需要GROUP_CONCAT在 file_path 上做一个;

SELECT products.*,
GROUP_CONCAT(DISTINCT product_files.file_name ORDER BY product_files.id SEPARATOR ',') AS file_name,
GROUP_CONCAT(DISTINCT product_files.file_path ORDER BY product_files.id SEPARATOR ',') AS file_path
FROM products 
INNER JOIN product_files 
ON products.id = product_files.product_id
GROUP BY products.id;

并且,为了安全起见,订购 GROUP_CONCAT 编辑的文件名和文件路径,因此它们处于相应的顺序。

而不是你可以分解 file_name 或 file_path 并循环遍历每个数组 - 以获取文件路径对(它们将位于每个数组中的相同位置)。

于 2012-11-01T15:51:43.393 回答