我有一张交易表,上面有买卖双方的字段。我想要一个查询,为每个参与交易的人输出一行,其中一列表示此人成为买家的次数,一列表示此人成为卖家的次数。
我目前正在实现我想要的结果:
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美元的价格买卖铅笔的次数——那么这个问题就变得更加棘手了。
我相信有更好的办法,但我花了一段时间寻找,没有找到太多。提前谢谢你的帮助。
最佳答案
您的查询非常合理,很可能是运行此查询的最快方式。您需要确保在transactions
:transactions(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;
但是,查询可能是表示和运行此逻辑的最佳方式。