2

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

「products」には基本的な製品データが含まれます

product_id | product_name | product_picture
1          | test         | pic.jpg
2          | samp         | sam.gif

product_details には、製品の詳細が含まれます (product_id ごとに 1 つ以上)

product_id | unit   | value
1          | size   | 100mm
1          | weight | 100g
2          | size   | 80mm
2          | color  | red

これをサイズ順に並べ替えたいと思います。(正規化されたテーブルに少し似ています) 結果:

2 | sample | sam.gif | size | 80mm  | color  | red
1 | test   | pic.jpg | size | 100mm | weight | 100g

プログラミング言語はPHPです。通常、私はこのようにします (PSEUDOCODE):

while (SELECT * FROM a) {
   while(SELECT * FROM b WHERE id = a.id) {
      myarray[a.id][b.unit] = b.value;
   }
}

しかし、結果を並べ替える方法がわかりません。(そして、PHP でのソートは SQL よりもパフォーマンスが低いと思いますか?)

編集: 新しいアイデア: 最初にクエリを実行して、正しい順序で product_ids を選択します:

while(SELECT products_id FROM products INNER JOIN products_details USING(products_id) WHERE unit = 'size' ORDER BY value) {
   while( SELECT value, unit FROM products_details WHERE products_id = id) {
      myarray[a.id][b.unit] = b.value;
   }
}
4

1 に答える 1

2

正規化する場合は、異なる列に異なるタイプのプロパティを含める必要があります。基本的に、プロパティのピボットを解除する必要があります。1 つの方法は、次のように条件付き集計を使用することです。

SELECT
  p.product_id,
  p.product_name,
  p.product_picture,
  MAX(CASE d.unit WHEN 'size'   THEN d.value END) AS size,
  MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight,
  MAX(CASE d.unit WHEN 'color'  THEN d.value END) AS color
FROM products p
LEFT JOIN product_details d
ON p.product_id = d.product_id
GROUP BY
  p.product_id,
  p.product_name,
  p.product_picture
;

これにより、次のようなデータセットが得られます。

product_id  product_name  product_picture  size   weight  color
----------  ------------  ---------------  -----  ------  -----
1           test          pic.jpg          100mm  100g    NULL
2           samp          sam.gif          80mm   NULL    red

すべてのプロパティに個別の列を割り当てたら、好きな方法で行を並べ替えることができます。例えば:

SELECT
  p.product_id,
  p.product_name,
  p.product_picture,
  MAX(CASE d.unit WHEN 'size'   THEN d.value END) AS size,
  MAX(CASE d.unit WHEN 'weight' THEN d.value END) AS weight,
  MAX(CASE d.unit WHEN 'color'  THEN d.value END) AS color
FROM products p
LEFT JOIN product_details d
ON p.product_id = d.product_id
GROUP BY
  p.product_id,
  p.product_name,
  p.product_picture
ORDER BY
  weight,
  color,
  size
;
于 2013-01-25T12:17:00.670 に答える