繁体   English   中英

Mysql按条件选择,除非满足另一个条件

[英]Mysql select by condition unless another condition is met

我有一个记录交易的表。 我想选择具有值为2000的4个事务的所有ID,但是然后排除那些具有2500个事务的事务。

SELECT t.tuserid, COUNT(*) AS CNT
  FROM transactions t
 WHERE t.amt = 2000
 GROUP BY t.tuserid
 HAVING CNT = 4;

这部分很简单,但我不确定如何有效地排除任何具有t.amt = 2500的任何事务的人。对where子句的简单子查询是否最有效?

SELECT t.tuserid, COUNT(*) AS CNT
  FROM transactions t
 WHERE t.amt = 2000
 AND t.tuserid NOT IN (SELECT x.tuserid FROM transactions x WHERE x.amt=2500)
 GROUP BY t.tuserid
 HAVING CNT = 4;

事务表很大,我不确定子查询是运行此过程的最有效方法。

是的,子查询在这里很好。 您的子查询不使用外部查询中的任何“变量”,因此它不是相关子查询。 对于外部查询的每一行,通常“执行”相关,并且通常是性能问题。

每个外部查询调用只会调用一次子查询。

另外,考虑你的索引总是一个好主意,所以在where子句中将一个索引放在used字段上是个好主意。 然后两个查询都应该在O(log(n))的复杂性类中,即使对于大数据表也应该非常快。

我没有资源来测试它,但没有子查询的替代方法可能只使用SUM

SELECT 
    t.tuserid, 
    SUM(CASE WHEN t.amt = 2000 THEN 1 ELSE 0 END CASE) AS CNT1, 
    SUM(CASE WHEN t.amt = 2500 THEN 1 ELSE 0 END CASE) AS CNT2
FROM 
    transactions t
GROUP BY 
    t.tuserid
HAVING 
    CNT1 = 4 AND CNT2 = 0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM