为了可靠地将所有产品放入不同数量的列中,您需要使用PIVOT
SQL Server、Oracle 等 DBMS 中存在的功能。
在 MySQL 的情况下,这种功能不可用,直接从查询生成 CSV 的最佳方法(正如您在问题的评论中提到的那样)是使用GROUP_CONCAT()
.
您之前有“blob”数据的原因GROUP_CONCAT()
是因为您试图将两种不同的数据类型连接到字符串中,因此 phpMyAdmin 会自动将其转换为[BLOB]
. 您必须将各种整数值(ID、价格等)与字符串值连接起来。您必须做的是CAST()
将整数值转换为您的字符串,GROUP_CONCAT()
以便 PMA 不会转换为 blob。有关CAST()的更多信息。
根据您拥有的 PMA 版本,它可能会或可能不会转换为[BLOB]
. 如果是这样,您可以随时展开+options
并选中“显示 blob 内容”,它将显示预期的结果。
仅基于您上面的示例(除了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
字符串“分解”为数组。首先在分隔符上展开:::
以分隔产品,然后对于每个产品,在分隔符上再次展开|||
以分隔该产品的详细信息。
我使用这些特定的分隔符是因为逗号可以出现在标题等字段中,并且您不希望脚本将字符串分隔在错误的位置。这种错误分隔的可能性是使用 的主要缺点之一GROUP_CONCAT()
,因此您必须根据它们出现在字段值中的可能性来决定最好使用哪些分隔符。
另外,在使用CONCAT
. 例如,假设每个产品的image
字段不是必需的并且可以包含NULL
. 如果其中一部分CONCAT()
是NULL
,那么整个连接字符串将变为NULL
。
因此,对于可以为空的任何字段,您都希望COALESCE()
在该字段上使用以防止NULL
s 被传递给CONCAT()
. (例如CONCAT(product, '|||', COALESCE(image, 'NoImage'))