mysql - 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 秒。
我敢肯定有一个更好的方法来做这个团体声明,但我无法理解它!
任何帮助深表感谢。
谢谢
解决方案
您可以在 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
在此表中有一个索引,以便仅选择您需要的行。
推荐阅读
- java - 从 Firestore Android 按类别名称对 Recyclerview 项目数据进行排序
- python - 无法导入pygame
- ios - VPN 未在 Mac Catalyst 上连接,出现错误,即返回 SecKeychainItemCopyContent 无法检索此项目的内容
- r - 如何将重要性标签添加到具有离散 x 轴值的成对箱线图中?
- r - 如何根据名称列表对我的数据框的行进行子集化?
- android - 使用 AlarmManger 在 android 中安排多个重复通知的问题
- python - Python pyspark 验证列是否为空
- jquery - jQuery Owl 旋转木马和车轮指示器
- python - PHP cURL 不工作,但 python 请求会话工作
- python - 我可以获取数据框三列的斜率并使用 python 中的值创建一个新列吗?