【问题标题】:Select Multiple rows in single column separated by New Line选择由换行分隔的单列中的多行
【发布时间】:2019-12-18 07:51:11
【问题描述】:

我有一个表格,其中的值如下所示。

    Id Name Fruit
    ------------
    1 Jon  Apple
    ------------
    2 Jon  Orange
    ------------
    3 Jon  Grape
    ------------
    4 Mike Apple
    ------------
    5 Mike Orange
    -------------

如何在 mysql 中将列区分为类似的内容?

    Name Fruit
    ----------
    Jon  Apple
         Orange
         Grape
    -----------
    Mike Apple
         Orange
    -----------

【问题讨论】:

  • 这两列是不同的吗?即使他们是你也无法在查询中做到这一点
  • 这是表示层的工作,而不是关系 DBMS。
  • 是的,不同的列
  • 考虑处理应用代码中数据显示的问题

标签: mysql sql group-concat


【解决方案1】:

应该这样做

SELECT name, GROUP_CONCAT(fruit SEPARATOR '\n') FROM your_table GROUP BY name

Demo in db<>fiddle

更新添加编号:

SELECT name ,
       GROUP_CONCAT(CONCAT (rn,')',fruit) SEPARATOR '\n')
FROM (
    SELECT * 
        ,ROW_NUMBER() OVER (PARTITION BY name) AS rn
    FROM your_table
    ) SQ
GROUP BY name

Demo with numbering in db<>fiddle

【讨论】:

  • 太棒了。这个可行..但我用 '
    ' 替换了 '\n' 因为 php 中的 '\n' 看起来像是在两者之间添加空格。无论如何,谢谢。
  • @ArunPalanisamy 再次感谢。我可以在 group_concat 中输入编号吗? 1)苹果 2)橙等。
  • @AmirulFahmi,是的,您可以进行编号。更新了答案。如果你使用 MySQL 8+,你可以直接使用ROW_NUMBER()。如果不使用这个LINK 来模拟ROW_NUMBER() 函数。
【解决方案2】:

另一种选择也是使用joins 来实现此要求。

select 
    case when t1.id = t2.id then t1.name else '' end 
    , t3.fruits
from 
    (select min(id) id, name from testA
        group by name) t1
left join
    testA t2 on t2.name = t1.name
left join
    testA t3 on t3.id = t2.id
order by t2.id asc

dbfiddle

【讨论】:

  • 谢谢。这个有效,但我需要每个名字的一行结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
相关资源
最近更新 更多