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