我有两张桌子。每个产品可能有一个或多个文件。但每个文件必须属于一个产品。
**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单元格吗?如果是,请尝试用一段代码解释一下?
答案 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并遍历每个数组 - 抓取文件路径对(它们在每个数组中都处于相同的位置)。