SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.05.2010 15:34:13

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Сравнение и обновление

Здравствуйте! Возникла следующая проблема:
Есть таблица 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)

Неактивен

 

#2 26.05.2010 21:56:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнение и обновление

Что показывают

show create table price;
show create table price_upd;
explain select price t1, price_upd t2 SET t1.price=t2.price WHERE t1.price!=t2.price AND t1.art=t2.art;

Неактивен

 

#3 26.05.2010 22:41:02

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Сравнение и обновление

"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

Неактивен

 

#4 27.05.2010 01:05:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнение и обновление

Что-то я совсема лабуду написал. Нужно

explain select t1.id, t1.price, t2.id, t2.price from price t1, price_upd t2 WHERE t1.price!=t2.price AND t1.art=t2.art;


Но уже и так понятно, что у вас нет индексов.Добавте
alter table price add index(art,price);
alter table price_upd add index(art);

После этого должно работать быстро.

Неактивен

 

#5 27.05.2010 11:11:34

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Сравнение и обновление

Огромнейшее Вам спасибо vasya!!!
И еще один вопрос, у меня сейчас происходит просто обновление по существующим артикулам. Допустим в файл ексель было добавлено еще 10 новых артикулов и соответственно они попали в таблицу price_upd. И теперь у меня обновятся только существующия артикулы. А как мне добавить эти недостающие 10 артикулов в таблицу price?

Отредактированно Garik (27.05.2010 11:30:31)

Неактивен

 

#6 27.05.2010 21:30:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнение и обновление

insert into price select price_upd.* from price_upd left join price using(art) where price.price is null;

Неактивен

 

#7 27.05.2010 21:58:06

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Сравнение и обновление

И еще раз спасибо!

Неактивен

 

#8 22.02.2012 21:30:34

Davest
Участник
Зарегистрирован: 22.02.2012
Сообщений: 5

Re: Сравнение и обновление

Подскажите, пожалуйста, про синтаксис этого запроса:
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)

Неактивен

 

#9 22.02.2012 21:56:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнение и обновление

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 запрос. В первом же сообщениии этой темы есть пример.

Неактивен

 

#10 23.02.2012 00:32:35

Davest
Участник
Зарегистрирован: 22.02.2012
Сообщений: 5

Re: Сравнение и обновление

Спасибо! И еще вопрос - в запросе:
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)

Неактивен

 

#11 23.02.2012 01:04:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнение и обновление

t1 и t2 это синонимы для таблиц price и price_upd соответственно.
запись "price t1" эквивалентна "price as t1" и есть объявление синонима
t1.price - расширенная форма записи (`имя таблицы`.`имя колонки`), т.е. речь в данном случае идет о колонке price из таблицы t1 (price).

Неактивен

 

#12 23.02.2012 10:05:49

Davest
Участник
Зарегистрирован: 22.02.2012
Сообщений: 5

Re: Сравнение и обновление

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)

Неактивен

 

#13 23.02.2012 22:36:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сравнение и обновление

update base LEFT JOIN base_temp ON base.art = base_temp.art set SET base.price=0 WHERE base_temp.art IS NULL;

Неактивен

 

#14 24.02.2012 04:34:43

Davest
Участник
Зарегистрирован: 22.02.2012
Сообщений: 5

Re: Сравнение и обновление

Волшебно. Благодарю!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson