如何统计带动态属性的Buy-Orders对应的匹配Sell-Orders数量?
可行方案
当然可以通过单条SQL查询实现需求,以下是适配你表结构的MySQL查询语句:
SELECT bo.id AS buy_order_id, bo.offer, COUNT(DISTINCT so.id) AS matching_sell_orders_count FROM Buy_Orders bo LEFT JOIN Sell_Orders so ON CAST(REPLACE(REPLACE(so.price, '.', ''), ',', '.') AS DECIMAL(10,2)) < CAST(REPLACE(REPLACE(bo.offer, '.', ''), ',', '.') AS DECIMAL(10,2)) LEFT JOIN Buy_Order_Attributes boa ON boa.buy_order_id = bo.id LEFT JOIN Sell_Order_Attributes soa ON soa.sell_order_id = so.id AND soa.attribute_id = boa.attribute_id GROUP BY bo.id, bo.offer HAVING -- 确保所有匹配的属性值都满足 Sell >= Buy SUM(CASE WHEN CAST(soa.value AS UNSIGNED) < CAST(boa.value AS UNSIGNED) THEN 1 ELSE 0 END) = 0 -- 确保Buy订单的所有属性,Sell订单都有对应记录(避免Sell缺失必要属性) AND COUNT(DISTINCT boa.attribute_id) = COUNT(DISTINCT soa.attribute_id) ORDER BY bo.id;
关键逻辑说明
价格转换与比较:
你的价格字段是带格式的字符串(如500.000,00€),需要先通过REPLACE清除千位分隔符、替换小数点符号,再转换为DECIMAL类型才能做数值比较。属性匹配校验:
- 通过关联
Buy_Order_Attributes和Sell_Order_Attributes,匹配相同属性ID的记录 HAVING子句中的第一个条件确保没有任何属性的Sell值小于Buy值- 第二个条件确保Buy订单要求的所有属性,Sell订单都存在对应记录(避免Sell缺失Buy关注的属性导致误匹配)
- 通过关联
统计有效Sell订单:
使用COUNT(DISTINCT so.id)避免同一Sell订单因多条属性记录被重复统计。
注意事项
- 如果属性值包含非整数类型(如小数面积),需要将
CAST(..., UNSIGNED)改为CAST(..., DECIMAL(10,2))适配 - 若允许Sell订单包含Buy订单未指定的属性(不影响匹配),可以去掉
HAVING中的第二个条件
内容的提问来源于stack exchange,提问作者Tim Kunze
相关产品推荐
相关产品推荐

