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

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

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

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

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

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

Я уже писал по поводу долгого скрипта (сделал нерационально, так как не совсем хорошо пишу запросы на MySQL).
И вот опять столкнулся с проблемой.

Есть две таблицы (over 9000 записей).
test_catalog и test_catalog_1.

Эти таблицы отличаются только тем, что в test_catalog_1 некоторые записи повторяются по нескольку раз (имя, сайт, айди. остальные поля разные но это неважно).

Мне нужно поле с сайтом из этой таблицы скопировать в другую, в которой уже только уникальные записи.

Вот скрипт:
PHP код:
$result mysql_query('SELECT site,id FROM test_catalog_1 GROUP BY id ');
$rows mysql_num_rows($result);
for (
$i 0;$i $rows;++$i){
    
$res mysql_fetch_array($result);
    
$id $res['id'];
    
$site $res['site'];
    
mysql_query('UPDATE test_catalog SET site = \''.$site.'\' WHERE id = \''.$id.'\' ');

Можно ли сделать это одним запросом? (Используя вложенные запросы или что то в этом роде) Просто сам я боюсь писать неправильные запросы для такой жирной базы, дабы не испортить ее.
Помогите кто чем может пожалуйста.
Mr_freeman вне форума Ответить с цитированием
Старый 15.05.2012, 20:27   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
Просто сам я боюсь писать неправильные запросы для такой жирной базы, дабы не испортить ее.
Не нужно бояться испортить - нужно делать бэкапы(резервные копии) перед ключевыми изменениями в БД.
Сделайте себе тестовую БД - точную копию основной, в которой в каждой таблице поместите, скажем, только по 100 записей - чтоб не ворочать постоянно огромные массивы данных ради тренировки.
И на этой тестовой БД тренируйтесь писать нужные вам запросы.
Когда нужный запрос будет работать как надо - выполняем его на основной БД (не забывая про бэкап!).

И пора бы уже начинать подтягивать знания в SQL - это ж не дело, что для каждой вашей задумки вам оптимальные запросы пишут на форумах, всем миром...
Нам не жалко - но это неправильно и не педагогично.

Отличный материал для изучаения SQL - Понимание SQL
Andkorol вне форума Ответить с цитированием
Старый 15.05.2012, 21:00   #3
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Вы все правильно говорите, я все понимаю. Я всегда все сам пытаюсь сделать, просто я недавно устроился на работу - а здесь не ждут, могут уволить, но за совет спасибо)

И все же хотелось бы услышать какую нибудь подсказку насчет выполнения этого одним запросом.
Mr_freeman вне форума Ответить с цитированием
Старый 15.05.2012, 23:15   #4
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Одним запросом можно - курсор в хранимой процедуре. Такая подсказка устроит ?) Или нужно что-то более конкретное?)
Cronos20 вне форума Ответить с цитированием
Старый 16.05.2012, 15:57   #5
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Было бы очень круто, если б по конкретнее=) Мну никогда не получались работающие хранимые процедуры(
Mr_freeman вне форума Ответить с цитированием
Старый 16.05.2012, 16:33   #6
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Не проверял, не тестировал, но как-то так
Код:
DROP PROCEDURE IF EXISTS `sp_proc`;
delimiter //
CREATE  PROCEDURE `sp_proc`()
BEGIN
	DECLARE pId integer;
        DECLARE SiteId integer; 
	DECLARE done integer default 0;
	
	DECLARE ProcCursor CURSOR FOR
               SELECT site, id FROM test_catalog_1 GROUP BY id ;

	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

	OPEN ProcCursor;

		WHILE done = 0 DO

			FETCH ProcCursor INTO SiteId, pId ;

                        UPDATE test_catalog SET site = SiteId WHERE id = pId ;

		END WHILE;

	CLOSE ProcCursor;
END;

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

Огромное спасибо=)

А как процедура запускается?
Просто прописать потом `sp_proc`(); ?
Mr_freeman вне форума Ответить с цитированием
Старый 16.05.2012, 18:49   #8
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

call `sp_proc`();
Cronos20 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
опять я опять мемо nyasha2013 Помощь студентам 2 19.05.2011 21:09
JS. Можно ли растормозить долгий процесс Stilet JavaScript, Ajax 3 29.11.2010 13:24
Долгий отклик от mdb-базы biohazardo БД в Delphi 5 07.10.2010 21:39
И опять мэйлы.. Опять... Pusher PHP 6 28.06.2008 03:08