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()是因为您试图将两种不同的数据类型连接到字符串中,因此 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()在该字段上使用以防止NULLs 被传递给CONCAT(). (例如CONCAT(product, '|||', COALESCE(image, 'NoImage'))

于 2012-06-20T03:43:58.150 回答
0

你不能用纯 mysql 做到这一点,原因如下:

  • 无法使用枢轴
  • 无法遍历一组特定值(在 oracle 下,您可以连接并遍历名称为“产品”的列,以构建与不同产品一样多的临时表)

作为一种解决方法,您可以以编程方式生成查询;对于找到的每个产品,将连接连接到查询:

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 回答