计算值在不同列中显示的次数

时间:2015-11-19 12:37:19

标签: sql performance postgresql sqlperformance

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

我目前正在实现我想要的结果:

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美元的价格购买或卖掉一支铅笔的次数 - 那么查询就会变得更加愚蠢。

我确定有更好的方法,但我花了一段时间寻找并且没有想出更多的东西。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的查询非常合理,很可能是运行此查询的最快方法。您希望确保INSERT ignore INTO tab1 ('col1_', 'col2_') SELECT 'col1','col2' FROM tab2 上有两个索引:transactionstransactions(buyer)

另一种方法是在使用显式连接之前汇总数据:

transactions(seller)

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