Замена значений в группах

pustors
Дата: 03.02.2013 09:55:07
В таблице "T_VK_bak2" два поля - quit и vk.
quit - все уникальные (т.е. не повторяются)
vk - должны быть уникальные, но есть повторяющиеся и в таких нужно сделать повторяющиеся quit соответственно.


Вот что сейчас:

| quit | vk |
-----------------
| 1 | qw |
| 2 | sd |
| 3 | df |
| 4 | gh |
| 5 | sd |
-----------------


Вот что должно получиться:

| quit | vk |
-----------------
| 1 | qw |
| 2 | sd |
| 3 | df |
| 4 | gh |
| 2 | sd |
-----------------


Вот мои мысли по этому поводу:

1. Нужно найти повторяющиеся vk
Это я сделал так:
SELECT vk, MIN(quit), MAX(quit), COUNT(*) AS `count` FROM T_VK_bak2 GROUP BY vk HAVING `count` > 1
Зазбивает vk по группам и повторяющиеся vk группирует в одну группу. Т.е. для уникальных vk будет индивидуальная группа, а для повторяющихся одна на двоих (троих и т.д.). Затем проверяет кол-во значений в группе и если в группе больше одного значения то запоминает МИНИМАЛЬНОЕ значение quit и МАКСИМАЛЬНОЕ значение quit. Если в группе одно значение, то МИНИМАЛЬНОЕ будет равно МАКСИМАЛЬНОМУ. Выводит: vk, МИНИМАЛЬНОЕ, МАКСИМАЛЬНОЕ, кол-во значение в группе.

2. Теперь мне нужно все МАКСИМАЛЬНЫЕ значения групп quit заменить МИНИМАЛЬНЫМИ. И вот тут я ничего не смог сделать. Для наглядности покажу свой не работающий вариант:

UPDATE `T_VK_bak2`
SET quit=(MIN(quit) GROUP BY vk HAVING COUNT(*) > 1)
WHERE quit=(MAX(quit) GROUP BY vk HAVING COUNT(*) > 1)


Т.к. в группе с уникальными занчениями vk МИНИМАЛЬНОЕ=МАКСИМАЛЬНОМУ, то @COUNT(*) > 1" можно не писать. Тогда значения заменятся сами на себя.

UPDATE `T_VK_bak2`
SET quit=(MIN(quit) GROUP BY vk)
WHERE quit=(MAX(quit) GROUP BY vk )



Мне кажется что где-то синтаксис нарушен... :(
pustors
Дата: 03.02.2013 11:11:52
Сделал по другому.. С помощью временной таблицы:

CREATE TABLE VK_MIN (quit_old INT , quit_new INT, vk VARCHAR(255)) AS
SELECT MIN(quit) as quit_new, MAX(quit) as quit_old, vk FROM T_VK_bak2 GROUP BY vk HAVING COUNT(*) > 1;
UPDATE T_VK_bak2, VK_MIN
SET T_VK_bak2.quit = VK_MIN.quit_new WHERE T_VK_bak2.vk = VK_MIN.vk;
DROP TABLE VK_MIN;