从其他行创建一行

时间:2011-12-29 15:53:45

标签: php mysql

我遇到了问题。我的表中的数据看起来像这样:

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中工作任何人都有任何想法吗?

非常感谢

1 个答案:

答案 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>

假设如下:

  • ID始终为8个字符+ EO
  • 总有两个记录属于一起。

在那种情况下:

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

执行以下操作:

  1. 返回短名称,短划线,长名称1,斜线,长名称2。
  2. 根据ID的前8个字符加入(LEFT(str, n)返回字符串的第一个 n 字符)。
  3. ID可能不完全匹配(这会阻止自身加入)。
  4. 这可能相当慢(由于使用LEFT()),但MySQL可能有一些黑魔法可以优化事物,索引也可能有所帮助。在真实的桌子上进行基准测试。