MySQL GROUP_CONCAT作为多个字段和自定义顺序

时间:2012-07-24 14:28:40

标签: mysql sql group-concat

这是我的表的结构: Tables structure

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

以下是我的尝试:

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;

结果是:

Result

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

2 个答案:

答案 0 :(得分:1)

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

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

将此查询的结果存储在parcel ID的映射中,以存储键,其中键是parcel 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

的修剪版本

答案 1 :(得分:0)

如果您还需要ID,则应该GROUP_CONCAT来自跟踪的ID,它们也会以相同的顺序给出。

或者在查询结束时设置ORDER BY,它也会操纵该数据。