Задать вопрос
@nata32

Как создать sql запрос?

Добрый день, есть запрос
SELECT *, agd.name AS attribute_group, a.attribute_id as attribute_id FROM attribute a LEFT JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) LEFT JOIN attribute_group_description agd ON (a.attribute_group_id = agd.attribute_group_id) WHERE 1 group by a.attribute_id ORDER BY ad.name ASC LIMIT 0,20

запрос выбирает все наименования атрибутов
есть таблица product_attribute в ней
product_id attribute_id

и есть product_category, в ней
product_id category_id
как добавить в запрос, что бы выбирались не все значения, а только те, которые есть в товарах конкретной категории по id категории переданной в переменной filter_category ?
пробовала добавить после WHERE 1
AND a.attribute_id IN (SELECT pc.product_id, pa.attribute_id FROM product_category pc LEFT JOIN product_attribute pa ON (pc.product_id = pa.product_id) WHERE pc.category_id = $filter_category GROUP BY pa.attribute_id)

дает ошибку
Uncaught Exception: Error: Operand should contain 1 column(s)
я понимаю что запрос возвращает несколько значений вместо одно, но как исправить это не могу добиться (
или может вообще неправильно составила запрос ?
спасибо.
  • Вопрос задан
  • 79 просмотров
Подписаться 2 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • Skillbox
    Профессия Python-разработчик + ИИ
    10 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Java-разработчик + ИИ
    9 месяцев
    Далее
Решения вопроса 1
kreout
@kreout
Java Backend Lead
Вы почти правильно составили подзапрос. IN допускает много строк, но справа от одного a.attribute_id должен быть один столбец. Сейчас выбраны pc.product_id и pa.attribute_id; нужен только второй.

После WHERE 1 и до внешнего GROUP BY добавьте:
AND a.attribute_id IN (
    SELECT pa.attribute_id
    FROM product_attribute AS pa
    JOIN product_category AS pc ON pc.product_id = pa.product_id
    WHERE pc.category_id = ?
)

Здесь ? — параметр подготовленного запроса, в который передаётся значение filter_category.

JOIN оставляет только атрибуты товаров, связанных с указанной категорией. Внутренний GROUP BY pa.attribute_id не нужен: для IN повторяющиеся значения не меняют результат. Например, если один атрибут есть у нескольких товаров этой категории, внешняя строка от этого не размножится.

Правило и пример такого подзапроса есть в документации MySQL про IN.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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