Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск товаров у которых есть или отсутствуют дубликаты
 
 автор: Борис Гаврилов   (18.06.2010 в 13:14)   письмо автору
 
 

Здравствуйте!
Прошу о помощи в составлении корректного запроса.
Имеется одна таблица `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


Сижу читаю мануалы и форумы, вижу фигу. Нужна помощь.
Заранее спасибо всем тем, кто откликнется!

  Ответить  
 
 автор: Trianon   (18.06.2010 в 13:29)   письмо автору
 
   для: Борис Гаврилов   (18.06.2010 в 13:14)
 

INDEX ( `category_id` , `unique` )

Здесь Вы перемудрили, IMHO
Отсюда и тормоза.

  Ответить  
 
 автор: Борис Гаврилов   (18.06.2010 в 13:43)   письмо автору
 
   для: Trianon   (18.06.2010 в 13:29)
 

Изменил время загрузки скрипта в пхп. После минутной обработки и полного зависания компьютера на эту же минуту, вижу что время запроса в пхпмайадмин выдаётся равным 0.5 сек, что за глюк? И ряды возвращаются совсем не те. Скорее всего корявый запрос. А index я использую наоборот для улучшения производительности, т.к. помимо такого запроса существуют много других, например (WHERE `unique`='0').

  Ответить  
 
 автор: Axxil   (18.06.2010 в 13:51)   письмо автору
 
   для: Борис Гаврилов   (18.06.2010 в 13:43)
 

>> Я хочу из базы в 5000 товаров найти те товары, у которых нету дубликатов

Судя по описанию полей запрос
SELECT * FROM products WHERE unique = 0 

Выдаст как раз уникальные товары

А запрос
SELECT * FROM products WHERE unique > 0 

Выдаст неуникальные

  Ответить  
 
 автор: Борис Гаврилов   (18.06.2010 в 14:03)   письмо автору
 
   для: Axxil   (18.06.2010 в 13:51)
 

SELECT * FROM products WHERE unique = 0 


Верно этот код выдаст уникальные товары (независимо от того, есть копии или нет), но задача в том чтобы найти товары, у которых есть копии, а не просто уникальные.

SELECT * FROM products WHERE unique > 0

Этот код выдаст товары, которые просто являются копиями.

  Ответить  
 
 автор: Trianon   (18.06.2010 в 13:54)   письмо автору
 
   для: Борис Гаврилов   (18.06.2010 в 13:43)
 

Еще раз.
У Вас нет индекса на поле unique. Отсюда и тормоза.
Тот факт, что это поле включено в составной индекс, это еще не повод считать его индексированным обычным образом.

Посмотрите EXPLAIN в конце концов, если не верите так.

  Ответить  
 
 автор: Борис Гаврилов   (18.06.2010 в 15:22)   письмо автору
 
   для: 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`

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования