SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 17.02.2010 12:11:38

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Выборка товаров по списку категорий

Есть таблица категорий и таблица товаров ( связь н-к-н). Есть ID-шники 5 категорий. Нужно для каждой из них выбрать по 4 товара.
Сейчас это делается так: Для каждой из категории отдельно выбираются товары (select * from product inner join product_category ...... ). Как можно сделать такую выборку за 1-н запрос ? Можно ли вообще ?
Спасибо.

Неактивен

 

#2 17.02.2010 12:52:35

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

Re: Выборка товаров по списку категорий

Можно, но только через UNION.

Неактивен

 

#3 17.02.2010 12:55:26

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка товаров по списку категорий

Еще есть вариант - выбрать запросом все товары из данных категорий с сортировкой по категории, а потом в скрипте отобразить только первые 4 для каждой. Все зависит от конкретной конфигурации базы и сколько именно товаров и категорий выбирается.

Неактивен

 

#4 17.02.2010 12:56:26

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Выборка товаров по списку категорий

Допустим, один запрос на выборку товаров для одной категории выполняется достаточно долго ( скажем... там.. 0.5с). Что даст больший прирост по скорости , выборка каждого из запросов отдельно или объединение из через UNION  ???

зы: таблицы - MyISAM

Отредактированно YAAP (17.02.2010 12:57:58)

Неактивен

 

#5 17.02.2010 12:58:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка товаров по списку категорий

0.5 секунды выполняется из-за сортировки и условий выборки? Если так, то замените запрос на SELECT id from product ... (вместо SELECT *) и посмотрите как он будет выполняться. Если на порядок быстрее, то останется только по id отобрать товары.

Неактивен

 

#6 17.02.2010 13:05:33

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Выборка товаров по списку категорий

Выполняется запрос долго потому, что в выборке используются еще 3 таблицы (через иннер\лефт джоин). Сейчас попробую таки сделать выборку по всем товарам из категорий и потом скриптом фильтровать их. Посмотри как это поможет.

Неактивен

 

#7 17.02.2010 13:10:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка товаров по списку категорий

Если есть сортировка и/или группировка, то стоит попробовать * заменить на product.id. Странно, что JOIN работает медленно - если индексы правильные, то не должен. А вот сортировка в Вашем случае будет сортировать всю громаду информации полученной JOIN-ами.

Неактивен

 

#8 17.02.2010 13:14:31

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Выборка товаров по списку категорий

Делаем вывод - индексы кривые. Сейчас буду смотреть в сторону упрощения запросов + посомтрю как и где индексы проставить лучше. Спасибо за быстрые ответы wink

Неактивен

 

#9 17.02.2010 13:17:35

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка товаров по списку категорий

И еще. Вам точно нужен JOIN до LIMIT? То есть участвует ли информация из других таблиц в условии WHERE? Упростите до максимума запрос - выберете только id нужных продуктов без доп. информации и примените LIMIT 4. А затем сделайте выборку информации со всеми JOIN но только для заданных 4 id-ников.

Неактивен

 

#10 17.02.2010 13:26:31

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Выборка товаров по списку категорий

Понял, так и буду делать.
Сейчас я делал как раз JOIN  для всех таблиц и только потом рубил лимитом. Эффективнее будет выбрать только нужные ID, а затем  использовать WHERE id in (1,2,3,4) ???
Я правильно понял ?

Неактивен

 

#11 17.02.2010 13:39:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка товаров по списку категорий

Да, я имел в виду это. LIMIT работает последним, когда уже результат практически готов и это делает JOIN-ы до него неэффективными

Неактивен

 

#12 17.02.2010 14:22:54

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Выборка товаров по списку категорий

Все ровно полностью исключить JOIN  до LIMIT  не получиться, разве что денормализацию делать.
Все дело в том, что нудно выбрать 4 товара, которые показаны ( т.е. надо из таблицы категория-товар выбрать по ИД категории товары, которые показаны на сайте, а для этого надо сделать  JOIN  с таблицей товара). Но все ровно прирост эта техника дала.

Неактивен

 

Board footer

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