PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
marat-dev
Отправлено: 14 Апреля, 2017 - 07:37:20
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2016  


Помог: 0 раз(а)




как лучше делать поиск товаров по фильтрам , использовать INNER JOIN ?
есть таблица фильтров отдельная , есть таблица товаров .

(Отредактировано автором: 14 Апреля, 2017 - 07:37:54)

 
 Top
3d_killer
Отправлено: 15 Апреля, 2017 - 23:02:00
Post Id



Участник


Покинул форум
Сообщений всего: 1913
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




да как раз это и нужно использовать
 
My status
 Top
Vladimir Kheifets
Отправлено: 20 Апреля, 2017 - 08:52:57
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 2 раз(а)




marat-dev пишет:
как лучше делать поиск товаров по фильтрам , использовать INNER JOIN ?
есть таблица фильтров отдельная , есть таблица товаров .


Задача:
Из таблицы "product" выбирается значение из колонки "name",
если значение в колонке "product1" таблицы "product" равно значению
в колонке " filter1" таблицы "filter" и значение колонке " filter1" равно $fiter1

Можно сделать так:
1.
SELECT product.name FROM product, filter WHERE product.product1=filter.filter1 AND filter.filter1='$fiter1'

2.
SELECT name FROM product LEFT JOIN filter ON product.product1=filter.filter1 WHERE filter.filter1='$fiter1'

3.
SELECT name FROM product WHERE product1 IN (SELECT filter1 FROM filter WHERE filter1='$fiter1')
 
 Top
3d_killer
Отправлено: 20 Апреля, 2017 - 18:39:39
Post Id



Участник


Покинул форум
Сообщений всего: 1913
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




вы своими лефт джоинами не путайте человека, если фильтров будет много и свойств много то все это будет висеть, уже проходили, использовать нужно только INNER JOIN уменьшая тем самым выборку
(Добавление)
вот тут разбирали тормоза
http://forum.php.su/topic.php?fo...80723#1458980723
 
My status
 Top
Vladimir Kheifets
Отправлено: 21 Апреля, 2017 - 08:56:55
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 2 раз(а)




[quote=3d_killer]вы своими лефт джоинами не путайте человека, если фильтров будет много и свойств много то все это будет висеть, уже проходили, использовать нужно только INNER JOIN уменьшая тем самым выборку...

В моём случае из таблицы ContrysAllCodes по коду FIFA находится код ISO3166_1_Alpha_3 страны, а из таблицы iso_3_code название страны.

Я сравнил время выполнения 4 запросов в том числе INNER JOIN и LEFT JOIN.
Вы правы LEFT JOIN работает медленнее, но быстрее других:
SELECT iso_3_code.country_en FROM iso_3_code, ContrysAllCodes WHERE iso_3_code.iso3=ContrysAllCodes. ISO3166_1_Alpha_3 AND ContrysAllCodes.FIFA='RUS'


Zeige Datensätze 0 - 0 (1 insgesamt, Die Abfrage dauerte 0.0006 Sekunden.)
SELECT iso_3_code.country_en FROM iso_3_code, ContrysAllCodes WHERE iso_3_code.iso3=ContrysAllCodes. ISO3166_1_Alpha_3 AND ContrysAllCodes.FIFA='RUS'
country_en
Russian Federation

eige Datensätze 0 - 0 (1 insgesamt, Die Abfrage dauerte 0.0007 Sekunden.)
SELECT country_en FROM iso_3_code WHERE iso3 IN (SELECT ISO3166_1_Alpha_3 FROM ContrysAllCodes WHERE ContrysAllCodes.FIFA='RUS')
country_en
Russian Federation


Zeige Datensätze 0 - 0 (1 insgesamt, Die Abfrage dauerte 0.0007 Sekunden.)
SELECT country_en FROM iso_3_code INNER JOIN ContrysAllCodes ON iso_3_code.iso3=ContrysAllCodes. ISO3166_1_Alpha_3 WHERE ContrysAllCodes.FIFA='RUS'
country_en
Russian Federation

Zeige Datensätze 0 - 0 (1 insgesamt, Die Abfrage dauerte 0.0008 Sekunden.)
SELECT country_en FROM iso_3_code LEFT JOIN ContrysAllCodes ON iso_3_code.iso3=ContrysAllCodes. ISO3166_1_Alpha_3 WHERE ContrysAllCodes.FIFA='RUS'
country_en
Russian Federation
 
 Top
Мелкий Супермодератор
Отправлено: 21 Апреля, 2017 - 11:29:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11520
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 557 раз(а)





Немецкая локаль? Я удивился


Сколько циклов проверяли? Результаты в рамках погрешности измерения.
Разница inner и left join в поведении, запросы не эквивалентны. По части производительности в mysql - left join выполняется строго в одном порядке. (right join, к слову, mysql делать не умеет, переписывает в left), тогда как для inner планировщик может свободно изменять порядок объединения и использовать другие варианты индексов.
Старомодная запись через from t1, t2 - всё так же inner join. Обе записи планировщик переписывает в идентичное представление.
in (subquery) штука повеселее. В старых версиях была бага и такой запрос был отвратителен по производительности, сейчас подкрутили. Емнип, тоже может быть переписан планировщиком в inner join, а может и так выполняться. По усмотрению планировщика.

Универсально можно сказать только то, что не надо делать left join, если не нужно именно его поведение. В остальных случаях бывают сюрпризы из-за реального распределения данных.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB