选择具有多个可能值的所有行

时间:2018-12-24 16:11:25

标签: mysql sql

我正在尝试从产品表(*)中获取具有以下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"
        )
    )
)

但是很明显,由于“ OR”,它不起作用。

它将返回具有一组sub_property的所有商品,而不是返回具有所有sub_property的所有商品。

数据库HERE

3 个答案:

答案 0 :(得分:0)

更新2:

我建议对每个属性和每个sub_property使用LEFT JOIN,然后检查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

示例:imperative commands

具有2个新的“ KEYS”(索引)以提高性能的示例:

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/6

使用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/7

答案 1 :(得分:0)

所以...我不确定这是否是验证两个答案的正确方法,但是我得到了两个有效答案。

这是@SteffMächtel使用LEFT JOIN(https://stackoverflow.com/a/53915792/5454875)的第一个

第二个来自@Shidersz(请参阅原始问题下方的评论),使用INNER JOIN)

我使用并使用INNER JOIN的方法是您需要的吗?db-fiddle.com/f/t6RrnhDPQuEamjf2bTxFeX/5

编辑

@Shidersz解决方案不起作用,因为它会选择所有我不想要的至少一种条件的产品。我希望产品具有所有条件。

答案 2 :(得分:0)

使用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