从 MySQL 中的一组中挑选出特定值

Picking out specific values from a group in MySQL

这似乎是一个很简单的问题,但我找不到好的解决方案。我正在尝试 select 来自格式略有错误的 table 的信息。基本上,无论 sequence=0person_id 实际上应该是 company_id。然后,此 company_id 适用于具有相同 group_id.

的所有行

有人认为以这种方式格式化事物而不是简单地使用 company_id 列是个好主意,但这使得公司尝试 select 变得非常困难。简单地添加这个额外的列并修复格式会让我的编程变得容易得多。

我想转成这样:

+----------+------------+-----------+----------+
| 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 行,这是非常低效的。不过这是一次性修复,所以我不介意让它 运行 过夜。

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

首先更改 table 并添加新列:

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 |