【问题标题】:MySQL GROUP_CONCAT as multiple fields and custom orderMySQL GROUP_CONCAT 作为多个字段和自定义顺序
【发布时间】:2012-07-24 14:28:39
【问题描述】:

这是我的表格的结构:

这是我想要的查询结果(考虑到用户向我提供了2|4|1 模式):

这是我尝试过的:

SELECT parcel.TrackCode, parcelType.Name, GROUP_CONCAT(track.DateTime SEPARATOR '|') AS dt
FROM track
JOIN parcel ON track.ParcelID = parcel.ID
JOIN parcelType ON parcel.ParcelTypeID = parcelType.ID
JOIN event ON track.EventID = event.ID
GROUP BY parcel.ID;

结果是:

所以问题是我需要 GROUP_CONCAT() 将数据划分为几个字段(date where track.eventID = 3date where track.eventID = 1date where track.eventID = 5date where track.eventID = 7 # 考虑到模式是3|1|5|7)。有什么想法吗?

【问题讨论】:

  • 用户是否总是只需要查看 3 个事件?
  • 不,模式可能是 3|2|5|4|1|7。更改了第二个模式示例以使其更加清晰。谢谢。
  • 呃。模式中有最大数量的项目吗?
  • 如果您的事件类型数量有限,为什么不一次汇总所有类型,然后选择用户想要的字段?
  • @HolgerBrandt 该模式在配置文件中定义,项数不限。

标签: mysql sql group-concat


【解决方案1】:

我建议运行两个查询。首先这个,获取相关事件:

SELECT ParcelID, EventID, DateTime
FROM track
WHERE EventID IN(1, 2, 4)

将此查询的结果存储在包裹 ID 到事件数组的映射中,其中键是包裹 ID,值是另一个数组。在该内部数组中,键是事件 ID,值是事件日期。

array(1 => array(
        2 => '2012-05-15 15:33:00', 
        4 => '2012-05-22 11:35:41', 
        1 => '2012-05-04 18:58:30'
    ),
    2 => array(
        2 => '2012-07-01 09:05:56', 
        4 => '2012-07-14 13:32:00', 
        1 => '2012-06-27 12:44:32'
    )
);

然后,使用类似下一个这样的查询来获取包裹列表,对于每个包裹,您可以轻松地在内存中查看前一个查询的结果,以找出每个事件的日期,对于任何给定包裹 ID。

SELECT parcel.ID, parcel.TrackCode, parceltype.Name
FROM parcel
JOIN parceltype ON parceltype.ID = parcel.ParcelTypeID

注意:这个答案是conversation that took place in the MySQL chat room的精简版

【讨论】:

    【解决方案2】:

    如果你还想要 ID,你应该GROUP_CONCATtrack 中的 id,它们也会以相同的顺序给出。

    或者在查询结束时设置一个 ORDER BY,它也会处理该数据。

    【讨论】:

    • 我不需要 EventID,但我需要根据 EventID 在一行中使用自定义订单模式的日期(如4|2|1|5 (Date WHERE EventId = 4|Date WHERE EventId = 2|Date WHERE EventId = 1|Date WHERE EventId = 5))
    猜你喜欢
    • 2012-09-28
    • 2012-09-08
    • 1970-01-01
    • 2014-09-18
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多