SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.06.2011 15:10:40

kpoxo6op
Участник
Зарегистрирован: 21.06.2011
Сообщений: 4

помогите составить запрос

У меня есть куча прайс-листов, и я их последовательно загружаю в базу.
Прайсы меняются со временем. Очень часто слегка меняется только имя категории, а её товары остаются прежними. Они есть в старой базе, но со старым именем категории. Вот такие слешка изменившиеся категории хочу отлавливать пере записью в основные таблицы.
Есть такие таблицы:

CREATE TABLE `cats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=823 DEFAULT CHARSET=cp1251;


INSERT INTO
  `cats`(
    `id`,
    `name`)
VALUES
  (1, 'Прайс-листы'),
  (2, 'Компьютеры'),
  (3, 'Настольные'),
  (4, '01. Компьютеры'),
  (5, '01. ФЕДЕРАЛЬНАЯ ЛИНЕЙКА ПК');

CREATE TABLE `goods` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `cid` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6084 DEFAULT CHARSET=cp1251;


INSERT INTO
  `goods`(
    `id`,
    `name`,
    `cid`)
VALUES
  (1, 'этот товар в основной таблице есть', 1),
  (2,
   'этот товар в основной таблице тоже есть',
   2),
  (6,
   'этот товар в основной таблице тоже есть',
   2),
  (7,
   'этот товар в основной таблице тоже есть',
   2),
  (3, 'товар только в основной таблице', 3),
  (8, 'товар только в основной таблице', 3),
  (4, 'товар только в основной таблице', 4),
  (5,
   'этот товар тоже есть, но у него сменилось имя родительской категории',
   5);

   CREATE TABLE `temp_cats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=819 DEFAULT CHARSET=cp1251;


INSERT INTO
  `temp_cats`(
    `id`,
    `name`)
VALUES
  (10, 'Прайс-листы'),
  (20, 'Компьютеры'),
  (30, 'Настольные'),
  (40, 'у этой категории тоже сменилось имя.'),
  (50, 'у этой категории сменилось имя');

  CREATE TABLE `temp_goods` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `cid` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6084 DEFAULT CHARSET=cp1251;


INSERT INTO
  `temp_goods`(
    `id`,
    `name`,
    `cid`)
VALUES
  (1, 'этот товар в основной таблице есть', 10),
  (2,
   'этот товар в основной таблице тоже есть',
   20),
  (3, 'этого товара в основной таблице нет', 30),
  (4, 'этого товара в основной таблице нет', 40),
  (6, 'этого товара в основной таблице нет', 40),
  (5,
   'этот товар тоже есть, но у него сменилось имя родительской категории',
   50),
  (7,
   'этот товар тоже есть, но у него сменилось имя родительской категории',
   50);


Мне требуется выбрать из временной таблицы temp_cats те категории, которые сменили имя,
но товары которых (temp_goods) присутствуют в основной таблице goods.

Связь товаров и категорий по id <-> cid.

Отредактированно kpoxo6op (22.06.2011 11:40:16)

Неактивен

 

#2 21.06.2011 16:31:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: помогите составить запрос

А какая связь cats и temp_cats? У них id разные?

Неактивен

 

#3 22.06.2011 01:25:54

kpoxo6op
Участник
Зарегистрирован: 21.06.2011
Сообщений: 4

Re: помогите составить запрос

paulus написал:

А какая связь cats и temp_cats? У них id разные?

id разные. Между ними связи нет.

Неактивен

 

#4 22.06.2011 12:59:13

kpoxo6op
Участник
Зарегистрирован: 21.06.2011
Сообщений: 4

Re: помогите составить запрос

Вроде, получилось то, что хотел:

SELECT distinct tc.name
FROM   temp_cats tc JOIN temp_goods tg ON tc.id = tg.pid
WHERE  tc.name NOT IN (SELECT c.name
                       FROM   cats c);

Отредактированно kpoxo6op (22.06.2011 13:00:12)

Неактивен

 

#5 22.06.2011 13:38:33

kpoxo6op
Участник
Зарегистрирован: 21.06.2011
Сообщений: 4

Re: помогите составить запрос

как теперь заапдейтить эти категории?

update temp_cats tc
SET    tc.new = 0
where  tc.name in (SELECT distinct tc.name
                   FROM   temp_cats tc JOIN temp_goods tg ON tc.id = tg.pid
                   WHERE  tc.name NOT IN (SELECT c.name
                                          FROM   cats c));


Получаю ошибку: You can't specify target table [trable] for update in FROM clause

Неактивен

 

Board footer

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