我对购物车的数据库进行了查询,该数据库涉及一些返回类似这样的东部连接(大大简化):
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但我发现它没有用处。
答案 0 :(得分:1)
要将所有产品可靠地置于 不同 列数中,您需要使用SQL Server(如SQL Server)中的PIVOT
功能,Oracle等。
对于MySQL,这种功能不可用,直接从查询生成CSV的最佳方式(正如您在问题的评论中提到的那样)将使用GROUP_CONCAT()
。< / p>
之前在GROUP_CONCAT()
中有“blob”数据的原因是因为您尝试将两种不同的数据类型连接到字符串中,因此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
传递给CONCAT()
。 (例如CONCAT(product, '|||', COALESCE(image, 'NoImage'))
答案 1 :(得分:0)
由于以下原因,您无法使用纯mysql执行此操作:
作为一种解决方法,您可以以编程方式生成查询;对于找到的每个产品,将连接连接到查询:
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。