You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计带动态属性的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;

关键逻辑说明

  1. 价格转换与比较:
    你的价格字段是带格式的字符串(如500.000,00€),需要先通过REPLACE清除千位分隔符、替换小数点符号,再转换为DECIMAL类型才能做数值比较。

  2. 属性匹配校验:

    • 通过关联Buy_Order_Attributes和Sell_Order_Attributes,匹配相同属性ID的记录
    • HAVING子句中的第一个条件确保没有任何属性的Sell值小于Buy值
    • 第二个条件确保Buy订单要求的所有属性,Sell订单都存在对应记录(避免Sell缺失Buy关注的属性导致误匹配)
  3. 统计有效Sell订单:
    使用COUNT(DISTINCT so.id)避免同一Sell订单因多条属性记录被重复统计。

注意事项

  • 如果属性值包含非整数类型(如小数面积),需要将CAST(..., UNSIGNED)改为CAST(..., DECIMAL(10,2))适配
  • 若允许Sell订单包含Buy订单未指定的属性(不影响匹配),可以去掉HAVING中的第二个条件

内容的提问来源于stack exchange,提问作者Tim Kunze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:01:02