Выбрать все строки с несколькими возможными значениями - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь получить все поля из таблицы продуктов (*), которые имеют следующий набор sub_property:

subprop_name = X subprop_value = Y

У меня есть следующие таблицы:

https://imgur.com/a/y4LGqMI (не удалось загрузить изображение, потому что формат не был принят)

Итак, для примера, если у меня есть два продукта, которые имеют в своей таблице sub_property записькак это: subprop_name = X subprop_value = Y

Я хотел бы вернуть его.Как описано в схеме, продукт может иметь несколько записей sub_property!

Пока у меня есть следующее:

SELECT prod_id,prod_name from product WHERE product.prod_id IN
(
    SELECT property.product_prod_id FROM property WHERE property.prop_id IN
    (
        SELECT property_prop_id from sub_property WHERE
        (
            sub_property.subprop_name="Type de scanner" AND sub_property.subprop_value="par transparence"
        )
        OR
        (
            sub_property.subprop_name="Pages/minute maximum" AND subprop_value="8.5 pages"
        )
    )
)

Но, очевидно, он не работает из-за 'ИЛИ.

Возвращает все элементы, у которых есть один из наборов sub_property, вместо всех продуктов, у которых есть все наборы sub_property.

DATABASE ЗДЕСЬ

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Итак ... Я не уверен, что это правильный способ проверки двух ответов, но я получил 2 рабочих ответа.

Это первый из @Steff Mächtel, использующий LEFT JOIN (https://stackoverflow.com/a/53915792/5454875)

А второй из @Shidersz (см. Комментарии ниже исходного вопроса), используя INNER JOIN)

" Я использовал и подход с использованием INNER JOIN, это что-то вроде этого, чтовам нужно? db-fiddle.com/f/t6RrnhDPQuEamjf2bTxFeX/5"

EDIT

@ Решение Shidersz не работает, поскольку оно выбирает все продукты, которыекак минимум одно из условий, которых я не хочу.Я хочу, чтобы у продукта были все условия.

0 голосов
/ 25 декабря 2018

Использование JOIN и IN для набора может быть простым решением для этого.

SELECT p.prod_id, p.prod_name
FROM product p
JOIN property AS prop 
  ON prop.product_prod_id = p.prod_id
JOIN sub_property AS subprop 
  ON subprop.property_prop_id = prop.prop_id
WHERE (subprop.subprop_name, subprop.subprop_value) IN (
  ('Type de scanner', 'par transparence'), 
  ('Pages/minute maximum', '8.5 pages')
)                          
GROUP BY p.prod_id, p.prod_name
0 голосов
/ 24 декабря 2018

ОБНОВЛЕНИЕ 2:

Я бы предложил использовать LEFT JOIN для каждого свойства и каждого sub_property, а затем проверить значение внутри условия WHERE:

SELECT product.prod_id, product.prod_name
FROM product 
LEFT JOIN property AS property_a ON property_a.product_prod_id = product.prod_id AND
                                    property_a.prop_name = "PROPERTY_GROUP_3"
LEFT JOIN sub_property AS sub_property_a ON sub_property_a.property_prop_id = property_a.prop_id AND 
                                            sub_property_a.subprop_name="property_4"
LEFT JOIN property AS property_b ON property_b.product_prod_id = product.prod_id AND
                                    property_b.prop_name = "PROPERTY_GROUP_4"
LEFT JOIN sub_property AS sub_property_b ON sub_property_b.property_prop_id = property_b.prop_id AND 
                                            sub_property_b.subprop_name="property_3"
WHERE sub_property_a.subprop_value="value_of_property_4" AND 
      sub_property_b.subprop_value="value_of_property_3"
GROUP BY product.prod_id

Пример: https://www.db -fiddle.com / f / wk344Gt6hm98xEhM4jei92 / 6

Пример с двумя новыми «КЛЮЧАМИ» (индексами) для повышения производительности:

ALTER TABLE `property`
 ... ADD KEY `prop_name` (`prop_name`);

ALTER TABLE `sub_property`
 ... ADD KEY `subprop_name` (`subprop_name`);

https://www.db -fiddle.com / f / wk344Gt6hm98xEhM4jei92 / 7

Пример с INNER JOIN вместо LEFT JOIN

Я не вижу разницы с EXPLAIN в тестовых данных, возможно, оптимизатор Mysql обрабатывает это внутреннее значение, равное

SELECT product.prod_id, product.prod_name
FROM product 
INNER JOIN property AS property_a ON property_a.product_prod_id = product.prod_id AND
                                     property_a.prop_name = "PROPERTY_GROUP_3"
INNER JOIN sub_property AS sub_property_a ON sub_property_a.property_prop_id = property_a.prop_id AND 
                                             sub_property_a.subprop_name="property_4" AND
                                             sub_property_a.subprop_value="value_of_property_4"
INNER JOIN property AS property_b ON property_b.product_prod_id = product.prod_id AND
                                     property_b.prop_name = "PROPERTY_GROUP_4"
INNER JOIN sub_property AS sub_property_b ON sub_property_b.property_prop_id = property_b.prop_id AND 
                                             sub_property_b.subprop_name="property_3" AND
                                             sub_property_b.subprop_value="value_of_property_3"
GROUP BY product.prod_id

https://www.db -fiddle.com / f / wk344Gt6hm98xEhM4jei92 / 8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...