За последние 24 часа нас посетил 22331 программист и 1027 роботов. Сейчас ищут 683 программиста ...

Упростить выборку из двух таблиц

Тема в разделе "MySQL", создана пользователем di_ans, 7 ноя 2020.

  1. di_ans

    di_ans Новичок

    С нами с:
    7 ноя 2020
    Сообщения:
    2
    Симпатии:
    0
    Добрый день.
    Есть две таблицы, в одной products хранится продукция, а в другой product_options фильтры свойств.

    products

    id | Name |
    ---------------------------------------------------------
    1 | Продукт 1
    2 | Продукт 2
    3 | Продукт 3
    4 | Продукт 4
    5 | Продукт 5


    product_options

    id | product_id | green | red | metal | plastic | glass
    --------------------------------------------------------------------
    1 | 1 | 1 | 0 | 1 | 0 | 0
    2 | 2 | 1 | 0 | 1 | 0 | 0
    3 | 3 | 0 | 1 | 0 | 1 | 0
    4 | 4 | 0 | 1 | 0 | 1 | 0
    5 | 5 | 1 | 0 | 0 | 0 | 1


    Я хочу вывести все продукты у которых отмечены свойства green и metal.
    Делаю я это так: Сперва делаю выборку из таблицы Product_options всех product_id у которых green=1 и metal=1, а
    затем в цикле прохожусь по полученному массиву и выбираю уже продукты.

    $result = $mysqli->query("SELECT product_id FROM `product_options` WHERE `green` = 1 AND `metal` = 1");
    while($data = $result->fetch_array())
    {
    $prod_res = $mysqli->query("SELECT name FROM `products` WHERE `id`='$data[product_id]'");
    $prod = $prod_res->fetch_array();
    echo $prod['name']."<br>";
    }

    Мне не даёт покоя мысль о том, что я сделал всё слишком мудрёно.
    Подскажите пожалуйста, можно ли как-то упростить мой запрос к базе данных.
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    При такой структуре второй таблицы, в ней нет необходимости.
    Можно всё хранить в первой.
    Пересмотрите структуру - пишите, подскажем.
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    запросы в цикле - ужасное зло. Их не должно быть.

    и да - структура непонятная.... если хотите динамические характеристики, то что-то типа
    id_product_id option_id
    1 1 2
    2 1 3

    + таблицу характеристик
    options
    id name slug
    2 Зеленый green
    3 Деревянный wood

    и запрос с join ами
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Да, но смысл все же может быть, если далеко не все продукты имеют опции.

    @di_ans, присоединение (LEFT JOIN) ко второй таблице первой.
    --- Добавлено ---
    P.S. Это типичная «таблица расширения», когда к каждой записи основной таблицы может быть добавлена максимум одна запись дополнительной. Идентификаторы можно использовать общие. Имеет смысл, когда далеко не всем записям осн. таблицы требуется расширение.
     
  5. di_ans

    di_ans Новичок

    С нами с:
    7 ноя 2020
    Сообщения:
    2
    Симпатии:
    0
    Спасибо всем.
    В общем, как только я задал вопрос, то тут же всё решил сам:))
    Вместо цикла с кучей запросов к базе, достаточно сделать подзапрос. Сравнил скорость и конечно же вариант с подзапросом работает намного быстрее.

    Вот решение:

    SELECT name FROM products WHERE id IN (SELECT product_id FROM `product_options` WHERE `green` = 1 AND `metal` = 1);

    Так же решил, что всё же объединю обе таблицы в одну, ибо так пожалуй будет удобнее делать выборки, правда смущает то, что у меня в итоге получится около 60-полей, но на просторах инета говорят, что на скорости это не сильно скажется.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    :eek:

    :eek: