1

私は3つのテーブルを持っています:

product:
    id
    name

product_image:
    product_id
    url

product_detail:
    product_id
    _key
    value

私がやりたいのは、特定の製品に関するすべての情報を 1 つのクエリで取得することだけです。group_concatenated 画像と詳細を取得していますが、グループ化に問題があります (そう思います)。時々、二重の画像が表示されます。私のクエリは次のとおりです。

   SELECT p.id, p.name,
GROUP_CONCAT(i.url ORDER BY i.id ASC SEPARATOR "{^sep^}") as imgs,
GROUP_CONCAT(d._key, "{^val^}", d.value ORDER BY d.id asc separator "{^sep^}") AS details
FROM product p
LEFT JOIN product_image i ON p.id = i.product_id
LEFT JOIN product_detail d ON p.id = d.product_id
WHERE p.id = ...
GROUP BY i.product_id, d.product_id 
ORDER BY p.id ASC LIMIT ...;

ところで、私は "{^sep^}" をセパレーターとして使用して、後で (php で) 結果を爆発させています。URL(および詳細)が間違った方法で展開されないようにしたかったのです(たとえば、区切り文字として「、」を使用し、一部のURLにも「、」が含まれていた場合)。これは良いアプローチですか?

4

1 に答える 1

0

p.id と p.name でグループ化する必要があります。DISTINCT も使用できます。

SELECT p.id, p.name,
GROUP_CONCAT(i.url ORDER BY i.id ASC SEPARATOR "{^sep^}") as imgs,
GROUP_CONCAT(d._key, "{^val^}", d.value ORDER BY d.id asc separator "{^sep^}") AS details
FROM product p
LEFT JOIN product_image i ON p.id = i.product_id
LEFT JOIN product_detail d ON p.id = d.product_id
WHERE p.id = ...
GROUP BY p.id, p.name
ORDER BY p.id ASC LIMIT ...;

また

SELECT DISTINCT p.id, p.name,
GROUP_CONCAT(i.url ORDER BY i.id ASC SEPARATOR "{^sep^}") as imgs,
GROUP_CONCAT(d._key, "{^val^}", d.value ORDER BY d.id asc separator "{^sep^}") AS details
FROM product p
LEFT JOIN product_image i ON p.id = i.product_id
LEFT JOIN product_detail d ON p.id = d.product_id
WHERE p.id = ...
GROUP BY i.product_id, d.product_id 
ORDER BY p.id ASC LIMIT ...;
于 2013-01-18T22:12:16.000 に答える