|
|
|
| Здравствуйте!
Прошу о помощи в составлении корректного запроса.
Имеется одна таблица `products` в ней находятся товары, товары могут быть в разных категориях и также могут повторятся несколько раз(дублироваться со ссылкой на айди оригинального товара)
В ней есть поля:
`id` (id товара)
`category_id` (id категории)
`unique` (это ссылка на оригинальный товар, если товар оригинален, то ему присваивается значение 0, если товар является дубликатом, то в этом поле стоит значение поля `id` оригинала)
`name` (название товара)
..... (остальные поля типа цены и т.д.)
CREATE TABLE `products` (
`id` INT NOT NULL ,
`category_id` INT NOT NULL ,
`unique` INT NOT NULL ,
`name` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `category_id` , `unique` )
) ENGINE = MYISAM ;
Я хочу из базы в 5000 товаров найти те товары, у которых нету дубликатов, чтобы продублировать их в дополнительные категории, также я хочу видеть те товары, которые уже имеют копии.
Мои запросы либо неправильны либо очень медленны настолько, что выдаёт script_execution_time_exceeded
Вот код для поиска товаров с дубликатами (я привязываю таблицу товаров к самой себе), который работает неправильно:
SELECT `products` . * ,
`p2`.`id`
FROM `products`
LEFT JOIN `products` AS `p2` ON `p2`.`unique` = `products`.`id`
WHERE `p2`.`id`!=NULL
Второй вариант:
SELECT *, (@id:=`products`.id) AS `id` FROM `products` WHERE (SELECT `id` FROM `products` WHERE `unique`=@id)!=NULL
Сижу читаю мануалы и форумы, вижу фигу. Нужна помощь.
Заранее спасибо всем тем, кто откликнется! | |
|
|
|
|
|
|
|
для: Борис Гаврилов
(18.06.2010 в 13:14)
| | INDEX ( `category_id` , `unique` )
Здесь Вы перемудрили, IMHO
Отсюда и тормоза. | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2010 в 13:29)
| | Изменил время загрузки скрипта в пхп. После минутной обработки и полного зависания компьютера на эту же минуту, вижу что время запроса в пхпмайадмин выдаётся равным 0.5 сек, что за глюк? И ряды возвращаются совсем не те. Скорее всего корявый запрос. А index я использую наоборот для улучшения производительности, т.к. помимо такого запроса существуют много других, например (WHERE `unique`='0'). | |
|
|
|
|
|
|
|
для: Борис Гаврилов
(18.06.2010 в 13:43)
| | >> Я хочу из базы в 5000 товаров найти те товары, у которых нету дубликатов
Судя по описанию полей запрос
SELECT * FROM products WHERE unique = 0
|
Выдаст как раз уникальные товары
А запрос
SELECT * FROM products WHERE unique > 0
|
Выдаст неуникальные | |
|
|
|
|
|
|
|
для: Axxil
(18.06.2010 в 13:51)
| |
SELECT * FROM products WHERE unique = 0
|
Верно этот код выдаст уникальные товары (независимо от того, есть копии или нет), но задача в том чтобы найти товары, у которых есть копии, а не просто уникальные.
SELECT * FROM products WHERE unique > 0
|
Этот код выдаст товары, которые просто являются копиями. | |
|
|
|
|
|
|
|
для: Борис Гаврилов
(18.06.2010 в 13:43)
| | Еще раз.
У Вас нет индекса на поле unique. Отсюда и тормоза.
Тот факт, что это поле включено в составной индекс, это еще не повод считать его индексированным обычным образом.
Посмотрите EXPLAIN в конце концов, если не верите так. | |
|
|
|
|
|
|
|
для: Trianon
(18.06.2010 в 13:54)
| | Всем огромное спасибо за помощь! Помог LEFT JOIN и IS NOT NULL, а также замена LEFT JOIN `products` AS `p2` ON `p2`.`unique` = `products`.`id` на LEFT JOIN `products` AS `p2` ON `products`.`id`=`p2`.`unique` | |
|
|
|