首页 > 解决方案 > Mysql - 基于多个选择和位置检索数据的最有效方法

问题描述

我很难找到从 Mysql 表中检索各种不同总和值的最有效方法。

假设我有 4 列 - 用户 ID、金额、付费、推荐。

我想根据用户 ID 检索以下内容:

1 - 已支付金额的总和(标记为 1)
2 - 未支付的金额总和(标记为 0)
3 - 已支付的金额和推荐的总和(在付费和推荐列上标记为 1)
4 - 未付金额和推荐金额的总和(在付费栏上标记为 0,在推荐栏上标记为 1)

我试过这样的嵌入式选择语句:

SELECT  (
    SELECT sum(payout)
    FROM   table1
    WHERE ispaid = 0 and userid = '100'
) AS unpaid
(
    SELECT sum(payout)
    FROM   table1
    WHERE ispaid = 1 and userid = '100'
) AS paid,
(
SELECT sum(payout)
    FROM   table1
    WHERE ispaid = 0 and isreferral = 1 and userid = '100'
) AS refpending,
(
SELECT sum(payout)
    FROM   table1
    WHERE ispaid = 1 and isreferral = 1 and userid = '100'
) AS refpaid

这行得通,但在我的服务器上它很慢(或者至少感觉它可能更快),大约 1.5 秒。

我敢肯定有一个更好的方法来做这个团体声明,但我无法理解它!

任何帮助深表感谢。

谢谢

标签: mysqlselect

解决方案


您可以在 SUM() 中使用条件表达式:

SELECT
  SUM(CASE WHEN ispaid=0 THEN payout END) AS unpaid,
  SUM(CASE WHEN ispaid=1 THEN payout END) AS paid,
  SUM(CASE WHEN ispaid=0 AND isreferral=1 THEN payout END) AS refpending,
  SUM(CASE WHEN ispaid=0 AND isreferral=1 THEN payout END) AS refpaid
FROM table1
WHERE userid = '100'

如果任何 CASE...WHEN 子句都不匹配给定行,则表达式的值为 NULL,并且 SUM() 忽略 NULL。如果您想更明确,也可以在其中包含一个ELSE 0子句,因为 SUM() 不会增加 0。

还要确保您userid在此表中有一个索引,以便仅选择您需要的行。


推荐阅读