2015-03-22 2 views
-1

Это кажется такой простой проблемой, но я не могу найти подходящее решение. Я пытаюсь выбрать информацию из слегка неверно отформатированной таблицы. В принципе, где бы ни находились sequence=0, person_id действительно должен быть company_id. Этот company_id затем применяется ко всем строкам, которые имеют одинаковые group_id.Выделение определенных значений из группы в MySQL

Кто-то подумал, что это хорошая идея, чтобы форматировать вещи таким образом, вместо того, чтобы просто иметь столбец 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, заявления, которые являются очень неэффективными учитывая, что у меня около 100 М строк. Хотя это одно время, но я не против, давая ему работать на ночь.

ответ

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 | 
+1

Спасибо, она работала отлично. – Rachie