Добрый день. Есть две таблицы, в одной 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>"; } Мне не даёт покоя мысль о том, что я сделал всё слишком мудрёно. Подскажите пожалуйста, можно ли как-то упростить мой запрос к базе данных.
При такой структуре второй таблицы, в ней нет необходимости. Можно всё хранить в первой. Пересмотрите структуру - пишите, подскажем.
запросы в цикле - ужасное зло. Их не должно быть. и да - структура непонятная.... если хотите динамические характеристики, то что-то типа id_product_id option_id 1 1 2 2 1 3 + таблицу характеристик options id name slug 2 Зеленый green 3 Деревянный wood и запрос с join ами
Да, но смысл все же может быть, если далеко не все продукты имеют опции. @di_ans, присоединение (LEFT JOIN) ко второй таблице первой. --- Добавлено --- P.S. Это типичная «таблица расширения», когда к каждой записи основной таблицы может быть добавлена максимум одна запись дополнительной. Идентификаторы можно использовать общие. Имеет смысл, когда далеко не всем записям осн. таблицы требуется расширение.
Спасибо всем. В общем, как только я задал вопрос, то тут же всё решил сам) Вместо цикла с кучей запросов к базе, достаточно сделать подзапрос. Сравнил скорость и конечно же вариант с подзапросом работает намного быстрее. Вот решение: SELECT name FROM products WHERE id IN (SELECT product_id FROM `product_options` WHERE `green` = 1 AND `metal` = 1); Так же решил, что всё же объединю обе таблицы в одну, ибо так пожалуй будет удобнее делать выборки, правда смущает то, что у меня в итоге получится около 60-полей, но на просторах инета говорят, что на скорости это не сильно скажется.