Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2013, 12:05   #1
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию Проставить id повторяющимся записям

Всем привет! Есть некая база данных (`i`,`str`,`id_catalog`):

........
(534,строка1,0),
(436,строка2,0),
(213,строка2,0),
(546,строка2,0),
(654,строка1,0),
(234,строка3,0),
(543,строка3,0),
(123,строка1,0),
(657,строка4,0),
(765,строка4,0),
........

Около 300 тыс. записей.
Необходимо проставить каждой строке id таким образом, чтобы у одинаковых строк был одинаковый id, например:

........
(534,строка1,52),
(436,строка2,53),
(213,строка2,53),
(546,строка2,53),
(654,строка1,52),
(234,строка3,54),
(543,строка3,54),
(123,строка1,52),
(657,строка4,55),
(765,строка4,55),
........

С каждой новой строкой id должен увеличиваться на 1.

Можно ли это сделать одним запросом или процедурой?
Или нужно написать небольшой скрипт на PHP?

Объем очень большой (всего 290 тыс. записей, уникальных - 170 тыс.), хотелось бы все сделать быстро.
Mr_freeman вне форума Ответить с цитированием
Старый 18.09.2013, 12:14   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

как-то так
Код:
select t.str 
, ( select count(distinct s.str) from t as s where s.str <t.str ) as id // для каждой строки считаем число разных строк которые меньше нее. это и будет ее id 
from t as t
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.09.2013 в 12:16.
evg_m вне форума Ответить с цитированием
Старый 18.09.2013, 12:40   #3
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
как-то так
Код:
select t.str 
, ( select count(distinct s.str) from t as s where s.str <t.str ) as id // для каждой строки считаем число разных строк которые меньше нее. это и будет ее id 
from t as t
Если сюда добавить update, то скрипт два дня будет работать. Наверное, это не подходит.
Mr_freeman вне форума Ответить с цитированием
Старый 18.09.2013, 15:04   #4
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
Если сюда добавить update, то скрипт два дня будет работать. Наверное, это не подходит.
JS полсекунды думал jsfiddle.net.
остается сгенерить апдейт, если айдишники (i) ключевые, то должен быстро перелопатить.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 18.09.2013, 15:32   #5
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

А для чего хранить в базе повторяющуюся информацию Я бы удалил строки такие вообще :|

Пардон, я не правильно понял смысл слова "строка". row и string попутал. =\
^-.-^ My GitHub

Последний раз редактировалось Fenex; 18.09.2013 в 15:34.
Fenex вне форума Ответить с цитированием
Старый 18.09.2013, 15:46   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
create table catalog
  idx int autoincrement (автоинкр. счетчик)
  name varchar (индексированое! поле имени)
end

add index name

insert into catalog (name)
select distinct str from t

update t set id_catalog =idx
from t inner join catalog on t.str=catalog.name

или
update t set id_catalog = ( select idx from catalog where catalog.name =t.str )
P.S. наличие индекса на поле t.str ускорит работу и для distinct str и для join t.str = catalog.name

Код:
drop table catalog
но почему-то кажется что он нам пригодится. Именно ради него все и затевалось.

Код:
alter table t
  drop column str

select * from t inner join catalog on t.id_catalog =catalog.idx

select * from catalog
select * from t where id_catalog =?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.09.2013 в 16:05.
evg_m вне форума Ответить с цитированием
Старый 18.09.2013, 15:51   #7
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
JS полсекунды думал jsfiddle.net.
остается сгенерить апдейт, если айдишники (i) ключевые, то должен быстро перелопатить.
Да, я вижу, что на яваскрипте быстро все сработало, но ведь мы говорим совсем не о нем. Что вы имеете ввиду под сгенерить апдейт?
Как мы будем использовать айдишники (i)?
Mr_freeman вне форума Ответить с цитированием
Старый 18.09.2013, 15:56   #8
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
create table catalog
  idx int autoincrement (автоинкр. счетчик)
  name varchar (индексированое! поле имени)
end

add index name

insert into catalog (name)
select distinct str from t

update t set id_catalog =idx
from t inner join catalog on t.str=catalog.name
P.S. наличие индекса на поле t.str ускорит работу и для distinct str и для join t.str = catalog.name

Код:
drop table catalog
но почему-то кажется что он нам пригодится. Именно ради него все и затевалось.
Я запутался в ваших запросах, не сталкивался раньше с внутренним соединением.
Не могли бы вы пояснить, что мы делаем в каждом запросе?
Mr_freeman вне форума Ответить с цитированием
Старый 18.09.2013, 17:08   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Не могли бы вы пояснить, что мы делаем в каждом запросе?
create table --создание таблицы
синтаксис описания полей скорее всего неверный! смотри комментарии к ним!
тоже относительно индексов.

Код:
insert into catalog --добавляем в catalog
select distict str --нужные нам разные!
+ автоматически их "нумеруем" (смотри поле автоинкр. счетчик!)

Цитата:
не сталкивался раньше с внутренним соединением.
используй запрос на обновление без соединения с внутренним подзапросом.
Код:
update t set id_catalog =( select idx from catalog --узнаем idx в catalog и подставляем ЕГО!
                                                where catalog.str =t.str --для подходящей (с тем же именем!)
                                             )
ВСЕ!

остальные ( select .... ) это иллюстрации моих телепатических догадок для чего нам был нужен catalog.
т.е. будущего использования поля id_catalog.

Цитата:
Я запутался в ваших запросах,
при таких знаниях можно читать Мартин Грубер. Понимание SQL.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.09.2013, 17:35   #10
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
create table --создание таблицы
синтаксис описания полей скорее всего неверный! смотри комментарии к ним!
тоже относительно индексов.

Код:
insert into catalog --добавляем в catalog
select distict str --нужные нам разные!
+ автоматически их "нумеруем" (смотри поле автоинкр. счетчик!)

используй запрос на обновление без соединения с внутренним подзапросом.
Код:
update t set id_catalog =( select idx from catalog --узнаем idx в catalog и подставляем ЕГО!
                                                where catalog.str =t.str --для подходящей (с тем же именем!)
                                             )
ВСЕ!

остальные ( select .... ) это иллюстрации моих телепатических догадок для чего нам был нужен catalog.
т.е. будущего использования поля id_catalog.


при таких знаниях можно читать Мартин Грубер. Понимание SQL.
Вы прямо прочитали мои мысли. Я уже создавал отдельную таблицу, и запускал запрос в точности такой же как у вас без внутреннего соединения. Он не то чтобы не прошел, я просто не дождался его выполнения.

Пробовал такой же запрос, ограниченный редактированием 10 записей - выполнился за 7 секунд - это очень долго. Возможно что то не так с индексами. Если вам не трудно, хотелось бы еще раз поподробнее услышать про индексы, которые вы говорили. И еще, запрос со внутренним соединением выполнится быстрее?
Mr_freeman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм для общего списка - сводная по повторяющимся записям. Hugo121 Microsoft Office Excel 4 19.04.2012 13:40
Как в таблицу проставить нумерацию? Юсуп Общие вопросы Delphi 20 08.04.2012 21:25
Как проставить рейтинг sasha_prof Microsoft Office Excel 1 01.10.2010 15:39
не могу проставить дату _Svetlana_ Microsoft Office Excel 11 13.02.2010 11:24
Номер страницы - проставить Zirat Microsoft Office Excel 9 12.11.2009 21:39