我有一张交易表,上面有买卖双方的字段。我想要一个查询,为每个参与交易的人输出一行,其中一列表示此人成为买家的次数,一列表示此人成为卖家的次数。
我目前正在实现我想要的结果:

SELECT u.user_id,
     (SELECT COUNT(*) FROM transactions AS b WHERE b.buyer = u.user_id),
     (SELECT COUNT(*) FROM transactions AS s WHERE s.seller = u.user_id)
FROM users AS u;

这工作很好,但我觉得它愚蠢和不必要的缓慢。当我开始想提出一些条件——比如,如果我想计算一个人在3月1日到3月31日之间以低于1美元的价格买卖铅笔的次数——那么这个问题就变得更加棘手了。
我相信有更好的办法,但我花了一段时间寻找,没有找到太多。提前谢谢你的帮助。

最佳答案

您的查询非常合理,很可能是运行此查询的最快方式。您需要确保在transactionstransactions(buyer)transactions(seller)上有两个索引。
另一种方法是在使用显式联接之前汇总数据:

select u.*, b.numbuyer, s.numseller
from users u left join
     (select buyer, count(*) as numbuyer
      from transactions
      group by buyer
     ) b
     on  b.buyer = u.user_id left join
     (select seller, count(*) as numseller
      from transactions
      group by seller
     ) s
     on s.buyer = u.user_id;

但是,查询可能是表示和运行此逻辑的最佳方式。

10-07 16:24