2

私は2つのテーブルを持っています。各製品には、1 つ以上のファイルが含まれる場合があります。ただし、各ファイルは 1 つの製品に属している必要があります。

**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_CONCATfile_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 を並べ替えて、それらが対応する順序になるようにします。

file_name または file_path を展開して各配列をループするよりも、ファイルとパスのペアを取得できます (それらは各配列の同じ位置にあります)。

于 2012-11-01T15:51:43.393 に答える