Как правильно выполнить запрос mysql с INNER JOIN с большими базами?

Добрый день всем! Скажите как правильно выполнить запрос есть 2 таблицы ( oc_product и oc_product_to_category)
в oc_product есть поля ( product_id, image ) в oc_product_to_category ( product_id, id_categor) . Нужно получить 1 поле image 1 любого товара ( LIMIT 1 ) с не пустой картинкой (`image` > '') с привязкой к категории. Смысл такой хочу получить картинку из товара для категории продукции.
товар с категорией связан через product_id в таблице oc_product_to_category)
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 3
Ninazu
@Ninazu
Проще двумя запросами. Подзапросы и джоин сам на себя не советую если база большая и индексы не расставлены или более сложная логика присутсвует вроде (показать картинку последнего продукта).
Вытащить все категории, потом вытащить по одному продукту для каждой через IN
Либо вариант второй, денормализировать, и хранить картинку категории в категории

P.S. Если всё же захотите через INNER JOIN, то не забудьте индекс на image добавить, и я бы делал не пустую строку а NULL

SELECT
    p.product_id,
    p.image
FROM oc_product_to_category c
    INNER JOIN oc_product p ON p.product_id = c.product_id
        AND p.image IS NOT NULL
WHERE c.id_categor = :categoryId
LIMIT 1
Ответ написан
Комментировать
Adamos
@Adamos
Джойнить не со всей таблицей, а с выборкой-группировкой по product_id.
Раз "большие базы" - скорее всего, будет пагинация и пересекать обе таблицы вообще незачем, проще достать картинки вторым запросом.
Ответ написан
@zava75 Автор вопроса
я наверное не правильно задал вопрос входным условием будет id категории, ищет 1 продукт не с пустым полем image сам запрос
SELECT
    `oc_product`.`image`,
    `oc_product`.`product_id`
FROM
    `oc_product`
INNER JOIN `oc_product_to_category` ON `oc_product`.`product_id` = `oc_product_to_category`.`product_id` AND `category_id` = '46195559' AND `oc_product`.`image` > ''
LIMIT 1;

как оптимизировать его ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы