从MySQL中的组中挑选特定值

时间:2015-03-22 20:38:18

标签: mysql select alter

这似乎是一个简单的问题,但我无法找到一个好的解决方案。我试图从稍微错误格式的表格中选择信息。基本上,只要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行,这些方法非常低效。这是一次性修复,所以我不介意让它一夜之间运行。

1 个答案:

答案 0 :(得分:0)

如果您想永久更改表格以包含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 |