这是我的工作查询,没有错误,但某些列的排序很奇怪。
$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太严格了,因为时间可能会有所不同。
答案 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 件重要的事情: