选择查询 - 在新列中包含标识符的行

时间:2012-06-20 02:33:15

标签: mysql sql

我对购物车的数据库进行了查询,该数据库涉及一些返回类似这样的东部连接(大大简化):

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但我发现它没有用处。

2 个答案:

答案 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执行此操作:

  • 不可能使用枢轴
  • 不可能遍历某组值(在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。