За последние 24 часа нас посетили 22494 программиста и 1276 роботов. Сейчас ищут 810 программистов ...

Сортировка по трём таблицам, возможно JOIN

Тема в разделе "PHP и базы данных", создана пользователем Андрей М, 18 июл 2019.

  1. Андрей М

    Андрей М Новичок

    С нами с:
    18 июл 2019
    Сообщения:
    2
    Симпатии:
    0
    Доброго времени суток.
    Я новичок в программировании, но тут мне попалась задача, решение которой меня заинтересовало.
    В некоторой степени я знаком с mysql, правда пишу с помощью RedBeanPHP, плохо знаком с JOIN'ами, может в этом и есть проблема.


    Собственно задача:
    Имеется БД с 3мя таблицами
    1. Товары (id, Название, Категория, Цена)
    2. Свойства товаров (id, Название свойства)
    3. Значение свойств товаров (id, id_Товара, id_Свойства, Значение).

    Есть набор свойств товара — цвет, размер, новинка. Необходимо выбрать все новинки зеленого цвета и вывести их на странице (верстка не имеет значения, просто в читаемом виде). В списке должна быть информация о размере и цвете товара.

    Кто может подсказать решение или наставить на нужный путь к решению задачи?
     
  2. sushko

    sushko Новичок

    С нами с:
    17 июл 2019
    Сообщения:
    78
    Симпатии:
    8
    SELECT

    goods.name,
    color_values.value,
    size_values.value

    FROM

    goods,

    attributes_names AS color_names,

    attributes_names AS size_names,
    attributes_names AS novelty_names,

    attribute_values AS color_values,
    attribute_values AS size_values,
    attribute_values AS novelty_values

    WHERE

    goods.id=color_values.good_id AND
    color_values.value='Зеленый' AND
    color_values.attribute_id=color_names.id AND
    color_names.name='цвет' AND


    goods.id=size_values.good_id AND
    size_values.attribute_id=size_names.id AND
    size_names.name='размер' AND

    goods.id=novely_values.good_id AND
    novely_values.value=1 AND

    novely_values.attribute_id=novely_names.id AND
    novely_names.name='Новинка'
    Как-то так. Это для случая, когда все товары имеют размер; если могут быть безразмерные товары, то туда один JOIN надо вкорячить.

    И еще одно. Такой запрос может быть неоптимальным - зависит от сервера БД, от наполненности таблиц и от построенных на них индексах. Мне кажется, что в некоторых случаях будет быстрее вытащить ID свойств "цвет", "размер" и "новинка" одним запросом и, имея эти ID'ы на клиенте, упростить второй (главный) запрос. Но тут уже надо экспериментировать - что окажется быстрее.
     
    Андрей М нравится это.
  3. Андрей М

    Андрей М Новичок

    С нами с:
    18 июл 2019
    Сообщения:
    2
    Симпатии:
    0
    Спасибо, буду пробовать!