【问题标题】:Picking out specific values from a group in MySQL从 MySQL 中的组中挑选特定值
【发布时间】:2015-03-22 20:38:17
【问题描述】:

这似乎是一个如此简单的问题,但我找不到好的解决方案。我正在尝试从格式稍有错误的表格中选择信息。基本上,无论sequence=0person_id 实际上应该是company_id。这个company_id 然后适用于所有具有相同group_id 的行。

有人认为以这种方式格式化而不是简单地使用company_id 列是个好主意,但这使得尝试按公司进行选择变得非常困难。只需添加这个额外的列并修复格式,我的编程就会变得更加容易。

我想变成这样:

+----------+------------+-----------+----------+
| group_id | date       | person_id | sequence |
+----------+------------+-----------+----------+
|        1 | 2012-08-31 |        10 |        0 |
|        1 | 2012-08-31 |        11 |        1 |
|        1 | 2012-08-31 |        12 |        2 |
|        2 | 1999-04-16 |        10 |        0 |
|        2 | 1999-04-16 |        21 |        1 |
|        2 | 1999-04-16 |        22 |        2 |
|        2 | 1999-04-16 |        23 |        3 |
|        2 | 1999-04-16 |        24 |        4 |
|        3 | 2001-01-09 |        30 |        0 |
|        3 | 2001-01-09 |        31 |        1 |
|        3 | 2001-01-09 |        11 |        2 |
|        3 | 2001-01-09 |        12 |        3 |
+----------+------------+-----------+----------+

进入这个:

+------------+----------+------------+-----------+----------+
| company_id | group_id | date       | person_id | sequence |
+------------+----------+------------+-----------+----------+
|         10 |        1 | 2012-08-31 |        11 |        1 |
|         10 |        1 | 2012-08-31 |        12 |        2 |
|         10 |        2 | 1999-04-16 |        21 |        1 |
|         10 |        2 | 1999-04-16 |        22 |        2 |
|         10 |        2 | 1999-04-16 |        23 |        3 |
|         10 |        2 | 1999-04-16 |        24 |        4 |
|         30 |        3 | 2001-01-09 |        31 |        1 |
|         30 |        3 | 2001-01-09 |        11 |        2 |
|         30 |        3 | 2001-01-09 |        12 |        3 |
+------------+----------+------------+-----------+----------+

我能想到的唯一方法是使用嵌套的 SELECT 语句,考虑到我有大约 100M 行,这非常低效。不过这是一次性修复,所以我不介意让它在一夜之间运行。

【问题讨论】:

    标签: mysql select alter


    【解决方案1】:

    如果您要永久更改表格以包含 company_id 列,请执行以下操作:

    首先修改表并添加新列:

    alter table your_table add company_id int;
    

    然后更新所有行以将公司设置为组的person_id = 0

    UPDATE your_table a 
    JOIN your_table b ON a.group_id = b.group_id  
    SET a.company_id = b.person_id
    WHERE b.sequence = 0;
    

    最后删除带有sequence = 0的行:

    DELETE FROM your_table WHERE sequence = 0;
    

    Sample SQL Fiddle

    最终结果将是:

    | group_id |       date | person_id | sequence | company_id |
    |----------|------------|-----------|----------|------------|
    |        1 | 2012-08-31 |        11 |        1 |         10 |
    |        1 | 2012-08-31 |        12 |        2 |         10 |
    |        2 | 1999-04-16 |        21 |        1 |         10 |
    |        2 | 1999-04-16 |        22 |        2 |         10 |
    |        2 | 1999-04-16 |        23 |        3 |         10 |
    |        2 | 1999-04-16 |        24 |        4 |         10 |
    |        3 | 2001-01-09 |        31 |        1 |         30 |
    |        3 | 2001-01-09 |        11 |        2 |         30 |
    |        3 | 2001-01-09 |        12 |        3 |         30 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2011-12-10
      • 2022-01-05
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多