mysql - 根据sql中重复的列ID为重复行值创建新列

标签 mysql sql database sorting mysql-5.7

我有一个包含 2 列的表格,第一列称为 ID,第二列称为 TRACKINGID 列有重复项,我想获取所有这些重复项并将它们合并到一行中,其中重复行中的 TRACKING 中的每个值都放入新列中在同一行中,我不再有重复项。

我尝试了一些建议的方法,其中所有值都将连接到一列中,但我希望重复的 ID 的这些 TRACKING 值单独存在列。下面的代码没有达到我的预期目的。

SELECT ID, TRACKING = 
    STUFF((SELECT DISTINCT ', ' + TRACKING
       FROM #t b 
       WHERE b.ID = a.ID 
      FOR XML PATH('')), 1, 2, '')
FROM #t a
GROUP BY ID

我想要这个:

| ID | TRACKING |
-----------------
| 5  | 13t3in3i |
| 5  | g13g13gg |
| 3  | egqegqgq |
| 2  | 14y2y24y |
| 2  | 42yy44yy |
| 5  | 8i535i35 |

把它变成这样:

| ID |  TRACKING  | TRACKING1 | TRACKING2 |
-----------------
| 5  |  13t3in3i  | g13g13gg  | 8i535i35  |
| 3  |  egqegqgq  |           |           |
| 2  |  14y2y24y  | 42yy44yy  |           |

最佳答案

在 MySQL 中执行此操作的(相对)痛苦的方法是使用相关子查询:

select i.id,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 0
       ) as tracking_1,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 1
       ) as tracking_2,
       (select t.tracking
        from t
        where t.id = i.id
        order by t.tracking
        limit 1, 2
       ) as tracking_3
from (select distinct id from t
     ) i;

尽管看起来很糟糕,但在(id,tracking)上建立索引时,它可能会具有令人惊讶的良好性能。

顺便说一句,您使用 stuff() 的原始代码会将所有内容放入一列中:

select id, group_concat(tracking)
from t
group by id;

关于mysql - 根据sql中重复的列ID为重复行值创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58000216/

相关文章:

php - 在查询中使用 while 循环

sql - 在 T-SQL 中替换没有游标的字符串中出现的字符串列表

android - 无法在 Realm.io 中处理 RealmList<RealmList<RealmInt>>

database - 这是可序列化的吗?

php - 断线不通过

mysql - mysql 查询是否将临时表写入磁盘以及它究竟在写什么?

php - MYSQL/PHP设置最长执行时间

mysql - 选择计数(不同的..)

mysql - 删除mysql中通过触发器插入表中的同一行

mysql - 我们如何在 MySQL 5.5 中快速执行此查询(group by + order by 具有 2 个左连接的多列)?