我遇到了问题。我的表中的数据看起来像这样:
route_id route_short_name route_long_name
AOUT1112E 12 Direction Pont-Viau
AOUT1112O 12 Direction Métro Cartier
JANV1212E 12 Direction Pont-Viau
JANV1212O 12 Direction Métro Cartier
JRAN1212E 12 Direction Pont-Viau
JRAN1212O 12 Direction Métro Cartier
我需要结果如下:
12 - 方向Pont-Viau /方向MétroCartier
OR
12 - 方向Pont-Viau /MétroCartier
我认为我可以使用两个数组,但我想在MySQL中这样做。此外,我在路面上有其他路线,如路线13,15等,所以它需要在SELECT ALL中工作任何人都有任何想法吗?
非常感谢
答案 0 :(得分:1)
要合并两个字符串,请使用CONCAT()
。要加入组中的值,请使用GROUP_CONCAT
。
SELECT
*,
CONCAT(
route_short_name,
" - ",
GROUP_CONCAT(route_long_name SEPARATOR ' / ')
) AS route_name
FROM
...
GROUP BY
route_short_name
它会返回这样的内容:
SHORTNAME - LONGNAME1 / LONGNAME2 / LONGNAME3
以上只会每route_short_name
返回一行。要获得所有这些,请使用子查询:
SELECT *, (
SELECT CONCAT(
route_short_name,
" - ",
GROUP_CONCAT(route_long_name.b SEPARATOR " / "))
FROM
your_table_name AS your_table_name_inner
WHERE
your_table_name_inner.route_short_name = your_table_name_outer.short_name
GROUP BY
your_table_name.route_short_name
) AS route_name
FROM
your_table_name AS your_table_name_outer
子查询与第一个示例几乎相同,只是它始终以SHORTNAME - LONGNAME1 / LONGNAME2 / etc
格式返回单行。外部查询返回所有记录,对于每条记录,执行子查询。毫无疑问,这是比第一个例子更重的查询。
仔细观察,似乎route_short_name
实际上与数据库结构完全无关,与我的假设不同。
我已经离开了上述答案,因为它可能对其他人有帮助。
如果我理解正确,您希望加入两个(不多于,不少于)记录,其中一个记录以route_id
结尾E
而另一个记录O
。< / p>
假设如下:
E
或O
。在那种情况下:
SELECT
*,
CONCAT(a.route_short_name, ' - ', a.route_long_name, ' / ', b.route_long_name)
FROM
your_table_name AS a
JOIN
your_table_name AS b
ON
LEFT(a.route_id, 8) = LEFT(b.route_id, 8)
AND
a.route_id != b.route_id
执行以下操作:
LEFT(str, n)
返回字符串的第一个 n 字符)。这可能相当慢(由于使用LEFT()
),但MySQL可能有一些黑魔法可以优化事物,索引也可能有所帮助。在真实的桌子上进行基准测试。