MYSQL GROUP_CONCAT 与 ORDER BY 奇怪的排序结果

Str*_*Dog 1 mysql sql

这是我的工作查询,没有错误,但按某些列排序很奇怪。

$query = mysql_query("SELECT ServiceType, Location, Destination, Name, PAX,
                      TransferTime, Ticket SUM(PAX) AS TotalPAX,
                      GROUP_CONCAT( Coupon SEPARATOR '<BR>') AS PasTicket,
                      GROUP_CONCAT( TransferTime SEPARATOR '<BR>') AS PasTransferTime,
                      GROUP_CONCAT( Location SEPARATOR '<BR>') AS PasLocation,
                      GROUP_CONCAT( Destination SEPARATOR '<BR>') AS PasDestination,
                      GROUP_CONCAT( Name SEPARATOR '<BR>') AS PasName,
                      GROUP_CONCAT( PAX SEPARATOR '<BR>') AS PasPAX
                      FROM Reservations WHERE Date = '$DateToday'
                      GROUP BY Ticket
                      ORDER BY ServiceType, TransferTime ASC");
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果,这些结果是正确的数据,但顺序错误:

参考 | 服务 | 时间 | 帕克斯 | 酒店 | 发件人 | 姓名 | 票
----+-----------+----------+-----+------------+--- ------+------------------+----------------
17 | 出发 | 15:00:00 | 1.0 | 伊贝罗之星 | 机场 | 弗朗西斯·欧根 | 门票:#110588
18 | 出发 | 15:20:00 | 2.0 | 乐园 | 机场 | 马丁·西巴 | 门票:#110589
19 | 出发 | 16:40:00 | 2.0 | 乐园 | 机场 | 约翰中央情报局 | 门票:#3376
20 | 出发 | 16:00:00 | 2.0 | 琉宫 | 机场 | 艾伦克莱默 | 门票:#110589
21 | 出发 | 16:10:00 | 2.0 | 琉宫 | 机场 | 约翰·威尔斯 | 门票:#110589
22 | 出发 | 16:20:00 | 2.0 | 琉宫 | 机场 | 彼得·朗 | 门票:#110589

当我GROUP BY Ticket查询有效但时间出现问题时,但是如果我添加ORDER BY Time ASCORDER BY 不起作用 -GROUP BY Time确实有效但随后我丢失了GROUP BY TicketGROUP BY Time无论如何我无法使用......数字 18、20、21 和 22 应该是 GROUPED连同时间在 ORDER ASC 中。

理想的做法是这样的:WHERE Date = '$DateToday' GROUP BY Ticket, TransferTime (LIKE '%TransferTime%') ORDER BY ServiceType, TransferTime ASC。这是因为 TransferTimes 可能会有几分钟的差异,而 GROUP BY 过于严格。

下面是它应该是什么的示例,按票号分组并按时间 ASC 排序。我保留了 REF 编号,因为它们是为了更清楚。奇怪的是,我们有这个工作,但在 MSSQL 中,但系统是 2013 年的,我们需要将它传递给 MYSQL 和 PHP。

参考 | 服务 | 时间 | 帕克斯 | 酒店 | 发件人 | 姓名 | 票
----+-----------+----------+-----+------------+--- ------+------------------+----------------
17 | 出发 | 15:00:00 | 1.0 | 伊贝罗之星 | 机场 | 弗朗西斯·欧根 | 门票:#110588
20 | 出发 | 16:00:00 | 2.0 | 琉宫 | 机场 | 艾伦克莱默 | 门票:#110589
21 | 出发 | 16:10:00 | 2.0 | 琉宫 | 机场 | 约翰·威尔斯 | 门票:#110589
22 | 出发 | 16:20:00 | 2.0 | 琉宫 | 机场 | 彼得·朗 | 门票:#110589
18 | 出发 | 16:40:00 | 2.0 | 乐园 | 机场 | 马丁·西巴 | 门票:#110589
19 | 出发 | 16:40:00 | 2.0 | 乐园 | 机场 | 约翰中央情报局 | 门票:#3376

GROUP_CONCAT 似乎工作正常。任何想法是怎么回事?

屏幕转储图像(名称和航班已更改)。数据完整正确,但票号排序不正确。我意识到这是因为我使用的 GROUP BY Time 过于严格,因为时间可能会有所不同。

PS: GROUP_BY SEPARATOR 是一个换行符 BR,由于某种原因没有被发布。 屏幕转储

Tho*_*ner 5

GROUP_CONCAT 结果字符串的顺序

您只是没有说明 group_concats 的订单,这将是

GROUP_CONCAT(... ORDER BY ...)
Run Code Online (Sandbox Code Playgroud)

例如

GROUP_CONCAT( Coupon ORDER BY Id SEPARATOR '<BR>') AS PasTicket
Run Code Online (Sandbox Code Playgroud)

所以你的 group_concats 的顺序是随机的。

行的顺序

至于行,您已经说明了一个顺序,但是您按不在选择列表中的列对结果进行排序,因此这是一种不可见的排序。(澄清的一个例子:如果我显示一个名字和姓氏的列表,但在幕后我按照他们居住的城市对这些人进行排序,这些名字似乎是无序的。)

当您分组时,Ticket了解是否正好有 oneServiceType和 one TransferTimeper也很重要Ticket。如果没有,您将获得任意选择的值,这可能是不受欢迎的。(示例:如果工单具有服务类型为 A、M 和 Z 的行,则将选择其中之一,然后由 DBMS 自行选择。)

最后:

正如已经提到的,当您聚合 ( GROUP BY) 时,SELECT *您将获得任意选择的值。假设一张票有两行,其中一行是 DEPARTURE | 15:00:00 和 ARRIVAL 之一 | 18:00:00,你甚至可能以DEPARTURE告终 | 18:00:00 取票。