Имя: Пароль:
IT
Веб-мастеринг
Помогите SQL запросом свернуть дубли
0 Помогите
 
18.05.15
06:50
Нужно найти все строки с дублирующимся полем, и в новое поле для всех этих строк присвоить значение идентификатора одной из строк.

Например таблица:

id   поле1
0    Красный
1    Картошка
2    Карандаш
3    Красный
4    Два
5    Два
6    Два

должна превратиться в такую таблицу:

id   поле1      НовоеПоле
0    Красный    0
1    Картошка
2    Карандаш
3    Красный    0
4    Два        4
5    Два        4
6    Два        4

В строку 0 и в строку 3 добавилось значение 0 в НовоеПоле, потому что 0 - это идентификатор одной из строк с дублирующимся значением "Красный"
В строку 4, 5 и в строку 6 добавилось значение 4 в НовоеПоле, потому что 4 - это идентификатор одной из строк с дублирующимся значением "Два"
В другие строки ничего не добавилось, т.к. там нет дублей.

А теперь самое главное, вопрос: Как сделать такой запрос?
1 Помогите
 
18.05.15
06:51
ЗЫ: MySQL
2 фобка
 
18.05.15
06:56
Первый запрос - простой select t.id, sum(1) group by t.id having sum(1) >1. Затем егоже иннер джойн между собой по id (так же как делают счетчик записей). Итоговый запрос left join с первой таблицей
3 фобка
 
18.05.15
07:01
Если есть счетчик записей то юзать его
4 Помогите
 
18.05.15
07:25
(2) Ничего не понял.

>> Первый запрос - простой select t.id, sum(1) group by t.id having sum(1) >1.
выдаст пустой результат, потому что id уникальный, sum(1)=1 всегда.

>> егоже иннер джойн между собой по id
Что это даст кроме удваивания столбцов?
5 фобка
 
18.05.15
08:03
6 Помогите
 
18.05.15
08:24
(5) Наверное ты не правильно понял мою задачу.
7 фобка
 
18.05.15
08:24
(6) нет, я все понял верно
8 фобка
 
18.05.15
08:26
(4) первый запрос, назовем его вложенный1 выдаст
Красный
Два
9 фобка
 
18.05.15
08:29
Чтобы пронумеровать его нужно его заджойнить с самим собой по т1.ид<=т2.ид.
Но если есть метод типа rownumber() логичнее использовать его.
10 фобка
 
18.05.15
08:30
Третьим действием ты исходную таблицу соединяешь с тем что получилось в (9) чтобы выцепить счетчик строк
11 Помогите
 
18.05.15
08:37
Мне не надо ничего нумеровать
12 Помогите
 
18.05.15
08:38
Но в общем я твою мысль понимаю
13 dk
 
18.05.15
08:46
select
  Id
  , Поле1
  , Влож.ID
from исходные
left join
(select
  min(ID)
  Поле1
from исходные
group by Поле1) влож
14 dk
 
18.05.15
08:54
select
  Id
  , Поле1
  , Влож.ID
from исходные
left join
(select
  min(ID)
  Поле1
from исходные
group by Поле1) влож ON Поле1 = Влож.Поле1
15 mehfk
 
18.05.15
08:57
(0) Напиши аналогичный запрос на языке запросов 1С, переведи промтом.
16 фобка
 
18.05.15
08:58
(11) тогда все проще
Select t.name, t2.id from t as t left join
(Select t.name, t.id group by t.name, t.id having sum1) >1) as t2 on t.name = t2.name
17 фобка
 
18.05.15
08:58
Having sum(1)>1
18 Помогите
 
18.05.15
09:00
Ага, спасибо. Самое то.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс