2012-11-01 51 views
2

我有兩個表。每個產品可以有一個或多個文件。但每個文件都必須屬於一個產品。如何分解由group_concat [distinct]合併的值?

**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

看起來像你幾乎在那裏!

你只需要在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 & FILE_PATH,所以他們是按照相應的順序。

比你可以爆炸file_name或file_path並循環遍歷每個數組 - 抓住文件路徑對(它們將在每個數組中相同的位置)。