由于当前接受的答案似乎稍后会引起问题,因此这是另一种选择。它在很大程度上基于lc 的解决方案。但负责订购。
首先:SQL 表没有明确定义的行顺序。当您查询表的所有行时,这些行将按特定顺序返回,但该顺序未定义,可能与添加行的顺序相关,也可能不相关,并且可能会意外更改。因此,当您想按给定顺序处理行时,您应该添加一列以包含某种序列号或 smilar。这就是为什么 lc. 一直在烦你关于位置的顺序。
如果您有这样的列,称为seq
,那么您可以使用以下查询:
SELECT GROUP_CONCAT(loc SEPARATOR ' - ')
FROM (
(SELECT 1 half, seq, SUBSTRING_INDEX(location, ' - ', 1) loc
FROM location_list
WHERE reservno='00004'
ORDER BY seq
LIMIT 1)
UNION ALL
(SELECT 2 half, seq, SUBSTRING_INDEX(location, ' - ', -1) loc
FROM location_list
WHERE reservno='00004')
ORDER BY half, seq
) locs
联合将产生一个不同位置的列表,使用最外层的选择将其组合成一个字符串。联合的第一部分产生路线第一部分的前半部分,而联合的第二部分将为您提供所有部分的后半部分。到目前为止联合结果的顺序是未定义的,所以我们需要一个整体的排序规则。我们还需要前半部分的排序规则,以便我们真正选择带有限制子句的路线的前半部分。
这是一个基于 Omesh 设置的 sqlfiddle。由于缺少seq
列,它使用icode
列来排序。因此,结果与您预期的不同,Manila - Bohol - Cebu - Manila
而是产生了。
如果添加seq
列,则必须更改数据库模式,因此您不妨更改它,使每个部分的两个端点变成两个不同的列。使用组合列CONCAT
很简单,但是拆分它们会增加开发人员和数据库引擎的查询的复杂性。
如果您无法添加序列列,因为您无法控制数据库模式,那么您就有麻烦了。您在这里的评论表明您一直在寻找一个循环,但是从无序数据中找到这样一个循环最好使用map来完成,这在 SQL 级别并不容易获得。如果必须,您可以通过存储过程来实现这一点,为陪审团的每个部分执行一个选择,但如果我是你,我宁愿在应用程序级别解决这个问题。