MySQL技术问题:如何筛选同时含BUY、SELL且状态为FILLED的product_id
解决方案:查询同时存在已成交买卖记录的商品ID
没问题,我来帮你搞定这个SQL查询需求。我们的目标是找出那些同时拥有已成交(FILLED)的买入(BUY)和卖出(SELL)操作的product_id,下面提供两种实用的实现方式:
方法一:GROUP BY + HAVING 分组筛选
这是最简洁高效的方法,适合大多数场景:
SELECT product_id FROM orderlist WHERE sell_state = 'FILLED' GROUP BY product_id HAVING COUNT(DISTINCT sell_type) = 2;
逻辑解释:
- 先通过
WHERE sell_state = 'FILLED'过滤出所有已成交的订单记录 - 按
product_id分组,把同一个商品的所有成交记录归为一组 - 用
COUNT(DISTINCT sell_type) = 2判断该组是否同时包含BUY和SELL两种操作类型(因为sell_type只有这两个可选值,数量为2就代表两种都存在)
方法二:自连接查询
如果需要更灵活的条件扩展(比如后续要加其他过滤规则),可以用自连接的方式:
SELECT DISTINCT o1.product_id FROM orderlist o1 INNER JOIN orderlist o2 ON o1.product_id = o2.product_id WHERE o1.sell_state = 'FILLED' AND o1.sell_type = 'BUY' AND o2.sell_state = 'FILLED' AND o2.sell_type = 'SELL';
逻辑解释:
- 将订单表自连接,把同一个
product_id下的记录关联起来 - 分别指定两个表的条件:一个是已成交的买入记录,另一个是已成交的卖出记录
- 用
DISTINCT去重,避免同一个商品ID被多次返回
小提示:
- 如果你的表中同一个商品的同类型成交记录很多,方法一的效率会更高,因为它只统计类型的唯一性,不关心记录数量
- 方法二更直观,适合需要对买卖记录分别添加额外过滤条件的场景(比如限定成交时间范围)
内容的提问来源于stack exchange,提问作者cryptodoxer
相关产品推荐
相关产品推荐

