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

时间:2017-05-15 18:45:45

标签: mysql

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

$query = mysql_query("SELECT ServiceType, Location, Destination, Name, PAX, 

TransferTime,Ticket SUM(PAX)AS TotalPAX,     GROUP_CONCAT(Coupon SEPARATOR'
')AS PasTicket,     GROUP_CONCAT(TransferTime SEPARATOR'
')AS PasTransferTime,     GROUP_CONCAT(位置分隔符'
')AS PasLocation,     GROUP_CONCAT(目的地分离器'
')AS PasDestination,     GROUP_CONCAT(名称分隔符'
')AS PasName,     GROUP_CONCAT(PAX SEPARATOR'
')AS PasPAX
    来自预订日期=' $ DateToday'分组机票订购方式     ServiceType,TransferTime ASC");

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

REF_SERVICE__TIME__PAX__HOTEL ___ FROM_________NAME________________________ 17 |离开| 15:00:00 | 1.0 | IBEROSTAR |机场| FRANCIS EUGEN |门票:#110588

18 |离开| 15:20:00 | 2.0 | PARADISUS |机场| MARTIN CIBBAR |门票:#110589

19 |离开| 16:40:00 | 2.0 | PARADISUS |机场| JOHN CIA | 门票:#3376

20 |离开| 16:00:00 | 2.0 | RIU PALACE |机场| ALAN KRAMER | 门票:#110589

21 |离开| 16:10:00 | 2.0 | RIU PALACE |机场|约翰威尔斯| 门票:#110589

22 |离开| 16:20:00 | 2.0 | RIU PALACE |机场| PETER LONG | 门票:#110589

当我在GROUP BY" Ticket"查询有效,但是Times不按顺序排列,但是如果我添加ORDER BY Time ASC,则ORDER BY不起作用 - GROUP BY Time确实有效但是我丢失了GROUP BY" Ticket"但我无论如何也不能使用GROUP BY时间......第18,20,21和22号应与ORDER ASC中的时间一起分组。

理想情况如下:WHERE Date =' $ DateToday' GROUP BY Ticket,TransferTime(LIKE'%TransferTime%')ORDER BY ServiceType,TransferTime ASC"。这是因为TransferTimes可能会有几分钟的差异而且GROUP BY太严格了。

下面是它应该是什么的示例,GROUPED BY票号并按TIME ASC排序。我已经把REF号码留下了,因为它们更清楚了。奇怪的是,我们有这个工作,但在MSSQL但系统是从2013年开始,我们需要将它传递给MYSQL和PHP。

REF_SERVICE__TIME__PAX__HOTEL ___ FROM_________NAME________________________ 17 |离开| 15:00:00 | 1.0 | IBEROSTAR |机场| FRANCIS EUGEN |门票:#110588

20 |离开| 16:00:00 | 2.0 | RIU PALACE |机场| ALAN KRAMER | 门票:#110589

21 |离开| 16:10:00 | 2.0 | RIU PALACE |机场|约翰威尔斯|门票:#110589

22 |离开| 16:20:00 | 2.0 | RIU PALACE |机场| PETER LONG |门票:#110589

18 |离开| 16:40:00 | 2.0 | PARADISUS |机场| MARTIN CIBBAR |门票:#110589

19 |离开| 16:40:00 | 2.0 | PARADISUS |机场| JOHN CIA | 门票:#3376

GROUP_CONCAT似乎工作正常。有什么想法吗?

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

PS:GROUP_BY SEPARATOR是一个换行符BR,由于某种原因尚未发布。 Screen Dump

2 个答案:

答案 0 :(得分:1)

GROUP_CONCAT结果字符串的顺序

您根本没有说明group_concats的订单,即

GROUP_CONCAT(... ORDER BY ...)

e.g。

GROUP_CONCAT( Coupon ORDER BY Id SEPARATOR '<BR>') AS PasTicket

所以你的group_concats的顺序是偶然的。

行的顺序

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

当您按Ticket分组时,了解每ServiceType是否只有一个TransferTime和一个Ticket也很重要。如果没有,你会得到任意选择的值,这可能是不受欢迎的。 (插图:如果故障单中包含服务类型为A,M和Z的行,则会选择其中一个,这是DBMS选择的机会。)

最后:

如上所述,当您汇总(GROUP BY),但SELECT *时,您将获得任意选择的值。假设一张票有两行,一行带有DEPARTURE | 15:00:00和一个有ARRIVAL | 18:00:00,您甚至可能最终获得DEPARTURE | 18:00:00的门票。

答案 1 :(得分:0)

请在 GROUP_CONCAT 函数内使用 ORDER BY 子句。这是一个示例查询:

SELECT GROUP_CONCAT(DISTINCT(QUOTE(id)) ORDER BY dob ASC) as children FROM `users` WHERE id IN ("218","221","214","215").

它有 4 件重要的事情:

  1. GROUP_CONCAT
  2. 与众不同
  3. 价值引述
  4. 在 GROUP_CONCAT 函数中添加 ORDER BY 子句