如何爆炸由group_concat [distinct]合并的值?

时间:2012-11-01 13:30:22

标签: php mysql join explode group-concat

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

**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单元格吗?如果是,请尝试用一段代码解释一下?

1 个答案:

答案 0 :(得分:0)

看起来你快到了!

您只需要在file_path上执行GROUP_CONCAT;

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-ed file_name&amp; file_path,所以它们是相应的顺序。

比你可以爆炸file_name或file_path并遍历每个数组 - 抓取文件路径对(它们在每个数组中都处于相同的位置)。