すべての製品をさまざまな数の列に確実に取り込むには、PIVOT
SQL 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()
ないようにフィールドで使用する必要があります。(例えばNULL
CONCAT()
CONCAT(product, '|||', COALESCE(image, 'NoImage'))