Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (1)
  • Как составить запрос mysql?

    @dvl0per
    sql php java c# html css javascript jquery
    У вас между таблицами ITEMS и ATTR связь M:N (многие ко многим) поэтому логичнее всего выбирать из вспомогательной таблицы ATTR_ITEMS и связывать с ней уже прочие таблицы.
    То есть основное тело запроса (до конструкции WHERE) будет что-то вроде
    SELECT *
    FROM `attr_items` ai
    inner join `items` i on ai.id_item = i.id
    inner join `attr` a on ai.id_attr = a.id

    Не совсем понятно, как определяется значение для категории.
    Допустим, что категория "Авто/мото" имеет id = 2, тогда для первой части вопроса:
    SELECT *
    FROM `attr_items` ai
    inner join `items` i on ai.id_item = i.id
    inner join `attr` a on ai.id_attr = a.id
    WHERE
    /* условие для категории */
    (a.category_id = i.category and i.category = 2) and
    /* условие для марки автомобиля */
    (a.name = 'Марка' and ai.val = 'Audi') and
    /* условие для модели автомобиля*/
    (a.name = 'Модель' and ai.val = 'Audi А8')

    для второй части вопроса:
    SELECT *
    FROM `attr_items` ai
    inner join `items` i on ai.id_item = i.id
    inner join `attr` a on ai.id_attr = a.id
    WHERE
    /* условие для категории */
    (a.category_id = i.category and i.category = 2) and
    /* условие для марки автомобиля */
    (a.name = 'Марка' and ai.val = 'Audi') and
    /* условие для года выбуска автомобиля*/
    (a.name = 'Годвыпуска' and ai.val BETWEEN 2005 and 2015)

    Обращаю внимание, что поле ATTR_ITEMS.VAL похоже имеет тип данных varchar, поэтому BETWEEN к для года выпуска нему может быть не применимо в том виде, что я указал. Возможно надо использовать конструкцию LIKE.

    P.S. На мой взгляд, такая структура БД пригодна только для маленьких объемов данных. Но, к сожалению, она часто применяется в 1С-Bitrix на продакшене, что приводит к тормозам.
    Ответ написан
    2 комментария