我有一个电子商务网站的MYSQL表(offer_properties):
+----------+-------------+---------+
| offer_id | pkey | pvalue |
+----------+-------------+---------+
| 63 | shoesize | shoe_47 |
| 63 | sport | walking |
| 63 | color | multi |
| 12 | color | multi |
| 12 | shoesize | size_48 |
| 12 | shoesize | size_47 |
| 12 | shoesize | size_46 |
| 12 | sneakertype | comfort |
| 12 | sport | running |
+----------+-------------+---------+
什么是最简单的方法来找到报价在哪里
shoesize = size_48 AND sport = running
我可以做到
select offer_id from offer_properties where (pkey = "sport" and pvalue = "running") and offer_id IN (select offer_id from offer_properties where (pkey = "shoesize" and pvalue = "size_48"));
然而,这种递归方法确实很困难,因为可能会有各种属性匹配请求。此外,我还有其他需要JOIN的表,查询变得非常复杂。我有一个表保存值(价格,描述等),另一个规范化的表保存报价标签。
我LEFT JOIN
找到提供匹配某些标签与某些属性和某些值.然而,事情变得相当复杂非常quickly.
对于这样的场景,你会有什么指导?我应该使用Promises的简单查询,并使用应用程序逻辑来逐步过滤事物吗?
非常感谢
3条答案
按热度按时间xqkwcwgp1#
您可以使用
conditional aggregation
来避免自连接。View on DB Fiddle
vsikbqxv2#
你可以使用非常简单的self join:
或者你可以使用
EXIST
。它与你当前的查询非常相似。这两种解决方案都需要额外的构造,但对于当前的模型,我相信您没有机会避免它。
另一方面,我认为exists(作为您当前的查询)可以写在一行中,并且不应该使您的查询变得混乱。
knsnq2tg3#
不需要连接,也不需要子查询。我们可以使用
having
子句对聚合进行直接过滤: