Задача на копирование

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Задача:
Имеются две таблицы, вот они:
Код:
//Таблица 1 (главная):
CREATE TABLE IF NOT EXISTS `table` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `login` text NOT NULL,
  `name` text NOT NULL,
  `sity` text NOT NULL,
  `sex` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
INSERT INTO `table` (`id`, `login`, `name`, `sity`, `sex`) VALUES
(1, 'SanyoK', 'Александр', 'Москва', 'Мужской'),
(2, 'Konfetka', 'Алёна', 'Новосибирск', 'Женский'),
(3, 'МИлая', 'Катя', 'Питер', 'Женский'),
(4, 'Mad', 'Валера', 'Иркутск', 'Мужской');
Код:
Таблица 2 (второстепенная):
CREATE TABLE IF NOT EXISTS `newtable` (
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `login` text NOT NULL,
  `name` text NOT NULL,
  `sity` text NOT NULL,
  `sex` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;
INSERT INTO `newtable` (`id`, `login`, `name`, `sity`, `sex`) VALUES
(1, '', '', '', ''),
(2, 'Mad', '', '', ''),
(3, '', '', '', ''),
(4, 'МИлая', '', '', ''),
(5, 'SanyoK', '', '', ''),
(6, 'Konfetka', '', '', '');
Пояснение к полям:
`id` - обычный Ai, для пронумерования
`login` - Уникальное поле (т.е в таблицах больше не должно быть похожих логинов)
Остальное - понятно.
Задача:
Из первой таблицы перенести город, имя и пол во вторую таблицу, учитывая логины, не изменяя и удаляя пустые ячейки второй таблицы.
Условие:
- Не должно быть запросов в цикле
- Число sql запросов не должно превышать 2 шт
////////////////////////////////
Я нашел пока только 1 решение..
Может кто помочь? :)
 

Aristotel

Well-Known Member
Регистрация
14.04.2011
Сообщения
213
в ручную, копи-пест ;)
и запросов не надо!
 

Aristotel

Well-Known Member
Регистрация
14.04.2011
Сообщения
213
а как сделал если не секрет, думал об этом, и нечего не придумал.
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
Предполагаю, что был написан парсер и запущен на локалхосте с расширенными лиммитами выполнения скрипта
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Всё намного проще :)

Код:
//Число строк, которые нужно изменить
$x=10;
//Делаем запрос в первую таблицу
$sql=mysql_query("select * from `table` limit 0, $x");
//Формируем массивы данных
while($val=mysql_fetch_assoc($sql)){
$login[]="'".$val['login']."'";
$name[]=$val['name'];
$sity[]=$val['sity'];
$sex[]=$val['sex'];
}
//Формируем массивы для копирования
for($i=0; $i<count($login); $i++){
//Имена
$go.=" when ".$login[$i]." then '".$name[$i]."' ";
//Города
$go2.=" when ".$login[$i]." then '".$sity[$i]."' ";
//Пол
$go3.=" when ".$login[$i]." then '".$sex[$i]."' ";
}
mysql_query("update `newtable` set `name`=(case `login` $go end),`sity`=(case `login` $go2 end),`sex`=(case `login` $go3 end) where `login` in (".implode(',',$login).")");
Этот вариант полностю рабочий. Я специально в нем добавил комменты, что бы было понятно)
Думаю, может это кому то пригодится!
Но я пока не пробовал на большом колличестве строк, проверил только на 100 строках - у меня работает.
А будет ли копировать 10000 строк - может кто проверить?
 

Aristotel

Well-Known Member
Регистрация
14.04.2011
Сообщения
213
Код:
mysql_query("update `newtable` set `name`=(case `login` $go end),`sity`=(case `login` $go2 end),`sex`=(case `login` $go3 end) where `login` in (".implode(',',$login).")");
я в mysql не очень селен, я даже не представлял что так можно, что за case в mysql я не знаю. Как говорится "учится и только учится"! спасибо за вариант, буду разбирать.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ