Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица категорий и таблица товаров ( связь н-к-н). Есть ID-шники 5 категорий. Нужно для каждой из них выбрать по 4 товара.
Сейчас это делается так: Для каждой из категории отдельно выбираются товары (select * from product inner join product_category ...... ). Как можно сделать такую выборку за 1-н запрос ? Можно ли вообще ?
Спасибо.
Неактивен
Можно, но только через UNION.
Неактивен
Еще есть вариант - выбрать запросом все товары из данных категорий с сортировкой по категории, а потом в скрипте отобразить только первые 4 для каждой. Все зависит от конкретной конфигурации базы и сколько именно товаров и категорий выбирается.
Неактивен
Допустим, один запрос на выборку товаров для одной категории выполняется достаточно долго ( скажем... там.. 0.5с). Что даст больший прирост по скорости , выборка каждого из запросов отдельно или объединение из через UNION ???
зы: таблицы - MyISAM
Отредактированно YAAP (17.02.2010 12:57:58)
Неактивен
0.5 секунды выполняется из-за сортировки и условий выборки? Если так, то замените запрос на SELECT id from product ... (вместо SELECT *) и посмотрите как он будет выполняться. Если на порядок быстрее, то останется только по id отобрать товары.
Неактивен
Выполняется запрос долго потому, что в выборке используются еще 3 таблицы (через иннер\лефт джоин). Сейчас попробую таки сделать выборку по всем товарам из категорий и потом скриптом фильтровать их. Посмотри как это поможет.
Неактивен
Если есть сортировка и/или группировка, то стоит попробовать * заменить на product.id. Странно, что JOIN работает медленно - если индексы правильные, то не должен. А вот сортировка в Вашем случае будет сортировать всю громаду информации полученной JOIN-ами.
Неактивен
Делаем вывод - индексы кривые. Сейчас буду смотреть в сторону упрощения запросов + посомтрю как и где индексы проставить лучше. Спасибо за быстрые ответы
Неактивен
И еще. Вам точно нужен JOIN до LIMIT? То есть участвует ли информация из других таблиц в условии WHERE? Упростите до максимума запрос - выберете только id нужных продуктов без доп. информации и примените LIMIT 4. А затем сделайте выборку информации со всеми JOIN но только для заданных 4 id-ников.
Неактивен
Понял, так и буду делать.
Сейчас я делал как раз JOIN для всех таблиц и только потом рубил лимитом. Эффективнее будет выбрать только нужные ID, а затем использовать WHERE id in (1,2,3,4) ???
Я правильно понял ?
Неактивен
Да, я имел в виду это. LIMIT работает последним, когда уже результат практически готов и это делает JOIN-ы до него неэффективными
Неактивен
Все ровно полностью исключить JOIN до LIMIT не получиться, разве что денормализацию делать.
Все дело в том, что нудно выбрать 4 товара, которые показаны ( т.е. надо из таблицы категория-товар выбрать по ИД категории товары, которые показаны на сайте, а для этого надо сделать JOIN с таблицей товара). Но все ровно прирост эта техника дала.
Неактивен