计算一个值在不同列中出现的次数

Count number of times a value appears in different columns

我有 table 笔交易,其中包含买家和卖家的字段。我想要一个查询,为参与交易的每个人输出一行,其中一列表示该人成为买家的次数,一列表示该人成为卖家的次数。

我目前正在通过以下方式实现我想要的结果:

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;

但是,您的查询可能是表达和 运行 这种逻辑的最佳方式。