Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! Возникла следующая проблема:
Есть таблица price с прайсом, в ней около 17500 записей.
При загрузке эксель файла из него в новую таблицу price_upd загружается новый прайс из файла.
Собственно вопрос, как сравнить таблицы price и price_upd так, чтобы если цена у артикула из таблицы price отличается от цены этого же артикула из таблицы price_upd, то цена в таблице price обновлялась на цену из таблицы price_upd
Пробывал делать так:
$sql = mysql_query("UPDATE price t1, price_upd t2 SET t1.price=t2.price WHERE t1.price!=t2.price AND t1.art=t2.art");
Так вот на обновление цен у 12000 артикулов уходит около 8,5 минут!!! Как мне сделать так, чтобы данная операция выполнялась быстрее? Заранее спасибо!
Отредактированно Garik (26.05.2010 15:34:53)
Неактивен
Что показывают
Неактивен
"show create table price" выводит:
Table Create Table
price CREATE TABLE `price` (
`art` text NOT NULL,
`orignum` text NOT NULL,
`title` text NOT NULL,
`model` text NOT NULL,
`presence` int(1) NOT NULL,
`price` float NOT NULL,
`country` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
"show create table price_upd" выводит:
Table Create Table
price_upd CREATE TABLE `price_upd` (
`art` text NOT NULL,
`orignum` text NOT NULL,
`title` text NOT NULL,
`model` text NOT NULL,
`presence` int(1) NOT NULL,
`price` float NOT NULL,
`country` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
"explain select price t1, price_upd t2 SET t1.price=t2.price WHERE t1.price!=t2.price AND t1.art=t2.art;" выдает:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET t1.price=t2.price WHERE t1.price!=t2.price AND t1.art=t2.art' at line 1
Неактивен
Что-то я совсема лабуду написал. Нужно
Неактивен
Огромнейшее Вам спасибо vasya!!!
И еще один вопрос, у меня сейчас происходит просто обновление по существующим артикулам. Допустим в файл ексель было добавлено еще 10 новых артикулов и соответственно они попали в таблицу price_upd. И теперь у меня обновятся только существующия артикулы. А как мне добавить эти недостающие 10 артикулов в таблицу price?
Отредактированно Garik (27.05.2010 11:30:31)
Неактивен
Неактивен
И еще раз спасибо!
Неактивен
Подскажите, пожалуйста, про синтаксис этого запроса:
insert into price select price_upd.* from price_upd left join price using(art) where price.price is null;
Что означает using()?
И по этой же теме - а как удалить либо сделать нулевой цену у позиций, которые были в базе, но в новом прайсе отсутствуют?
Отредактированно Davest (22.02.2012 21:31:13)
Неактивен
Davest написал:
Подскажите, пожалуйста, про синтаксис этого запроса:
insert into price select price_upd.* from price_upd left join price using(art) where price.price is null;
Что означает using()?
price_upd.art=price.art
http://dev.mysql.com/doc/refman/5.5/en/join.html
Davest написал:
И по этой же теме - а как удалить либо сделать нулевой цену у позиций, которые были в базе, но в новом прайсе отсутствуют?
Соответственно update или delete запрос. В первом же сообщениии этой темы есть пример.
Неактивен
Спасибо! И еще вопрос - в запросе:
UPDATE price t1, price_upd t2 SET t1.price=t2.price WHERE t1.price!=t2.price AND t1.art=t2.art"
что такое t1 и t2, и что означает запись price t1 через пробел и t1.price через точку?
Отредактированно Davest (23.02.2012 00:36:49)
Неактивен
t1 и t2 это синонимы для таблиц price и price_upd соответственно.
запись "price t1" эквивалентна "price as t1" и есть объявление синонима
t1.price - расширенная форма записи (`имя таблицы`.`имя колонки`), т.е. речь в данном случае идет о колонке price из таблицы t1 (price).
Неактивен
Vasya, спасибо приогромное, постигаю потихоньку. Подскажите, пожалуйста, с запросом к sql:
Надо обновить в базе base ячейку price на 0 в строках, выбранных по условию (art), которых нет в новой базе base_temp.
Составил следующее:
UPDATE base SET price='0' WHERE art = 'SELECT base.art FROM base LEFT JOIN base_temp ON base.art = base_temp.art WHERE base_temp.art IS NULL'
Часть:
SELECT base.art FROM base LEFT JOIN base_temp ON base.art = base_temp.art WHERE base_temp.art IS NULL
отлично справляется с задачей, делает выборку отсутствующих и выводит их art`ы, но весь запрос в целом, попытка заменить цены на ноль хоть и выполняется успешно - ничего не меняет.
Где подправить?
з.ы. Я понял ляпу. Я art пытаюсь с массивом сравнить. Сделал из массива строку с разделителем , средствами php и затем UPDATE --//-- WHERE art in(<Сделанная строка>) и всё зафурыкало. В итоге очень тормозная конструкция вышла.
Теперь только один вопрос терзает - а можно таки сделать все это одним запросом sql ?
Отредактированно Davest (23.02.2012 13:27:21)
Неактивен
Неактивен
Волшебно. Благодарю!
Неактивен