0

ショッピングカートのデータベースにクエリがあり、次のようなものを返すいくつかの外部結合が含まれています(大幅に簡略化されています)。

Orderid |   Customer Name | Product | Image
 1      |      John       |  Prod1  | x.jpg
 1      |      John       |  Prod2  | e.jpg
 2      |      Paul       |  Prod3  | r.jpg
 3      |      Ringo      |  Prod1  | x.jpg

結果はこんな感じになりたいです

Orderid | Customer Name | Product1 | Image1 | Product2 | Image 2
  1     |      John     |   Prod1  |  x.jpg | Prod2    | e.jpg
  2     |      Paul     |   Prod3  |  r.jpg | NULL     | NULL
  3     |      Ringo    |   Prod1  |  x.jpg | NULL     | NULL

これは可能ですか?

以前のクエリではGROUP_CONCATを使用し、結果をblobとして取得しましたが、操作するのに便利ではありませんでした。

4

2 に答える 2

1

すべての製品をさまざまな数の列に確実に取り込むには、PIVOTSQL Server、OracleなどのDBMSに存在する機能を使用する必要があります。

MySQLの場合、そのような機能は利用できず、クエリから直接CSVを生成する最良の方法は(質問へのコメントで述べたように)を使用することGROUP_CONCAT()です。

以前に「blob」データGROUP_CONCAT()があった理由は、2つの異なるデータ型を文字列に連結しようとしていたため、phpMyAdminが自動的にに変換していたため[BLOB]です。文字列値とともにさまざまな整数値(ID、価格など)を連結している必要があります。あなたがしなければならないことは、 PMAがblobに変換されないように、CAST()あなたの中で文字列に整数値を与えることです。CAST()GROUP_CONCAT()の詳細。

使用しているPMAのバージョンに応じて、に変換される場合とされない場合があり[BLOB]ます。もしそうなら、いつでも「 blobの内容を表示+optionsする」を展開してチェックすることができ、期待される結果が表示されます。

上記の例に基づいて(product_id説明に加えてCAST()、次のようなことを行うことができます:

SELECT
    order_id,
    customer_name,
GROUP_CONCAT(CONCAT(CAST(product_id AS CHAR(6)), '|||', product, '|||', image) SEPARATOR ':::') AS order_products
FROM 
    orders
GROUP BY
    order_id,
    customer_name

これにより、次のような結果セットが得られます。

Orderid | Customer Name | order_products 
  1     |      John     |   1|||Prod1|||x.jpg:::2|||Prod2|||e.jpg
  2     |      Paul     |   3|||Prod3|||r.jpg
  3     |      Ringo    |   1|||Prod1|||x.jpg

次に、アプリケーションの構築に使用している言語に応じて、order_products文字列を配列に「分解」できます。最初に区切り文字で分解し:::て製品を分離し、次に各製品について、区切り文字で再度分解して|||その製品の詳細を分離します。

タイトルなどのフィールドにコンマが存在する可能性があり、スクリプトが文字列を間違った場所で区切ることを望まないため、これらの特定の区切り文字を使用します。この誤った分離の可能性は、を使用することの主な欠点の1つであるGROUP_CONCAT()ため、フィールド値内に存在する可能性に基づいて、使用するのに最適な区切り文字を決定する必要があります。

また、を使用する場合はnull許容フィールドに注意してCONCATください。たとえば、商品ごとに、imageフィールドは必須ではなく、を含めることができると言いますNULL。の一部がである場合CONCAT()NULL連結された文字列全体が。になりNULLます。

したがって、null許容のフィールドについては、 sがに渡されCOALESCE()ないようにフィールドで使用する必要があります。(例えばNULLCONCAT()CONCAT(product, '|||', COALESCE(image, 'NoImage'))

于 2012-06-20T03:43:58.150 に答える
0

次の理由により、純粋なmysqlでこれを行うことはできません。

  • ピボットを使用できない
  • 特定の値のセットをループすることはできません(Oracleでは、「product」のような名前の列に接続してループし、さまざまな製品と同じ数の一時テーブルを作成できます)

回避策として、プログラムでクエリを生成できます。見つかった製品ごとに、クエリへの結合を連結します。

select orderid, customer_name, product1, image1, producti, imagei, productn, imagen
from table t
   inner join table t1 on t1.product = 'product1' and t1.order_id = t.order_id
   inner join table ti on ti.product = 'producti' and ti.order_id = t.order_id
   inner join table tn on tn.product = 'productn' and tn.order_id = t.order_id

私はあなたのモデルについて何も知らないので、これはすべて非常に理論的です。

それが役に立てば幸い。rgds。

于 2012-06-20T03:21:27.230 に答える