2012-01-28 38 views
5

我有用户(user和pass,电子邮件)表,我想获得用户的数量,其中用户=“SomeUser的” 和电子邮件的数量,其中电子邮件=在一个查询“someemail”我想出了这个:在一个查询中选择两项罪名

SELECT (

SELECT COUNT(user) 
FROM users 
WHERE user = 'someuser' 
), (

SELECT COUNT(email) 
FROM users 
WHERE email = 'someemail' 
) 
FROM users 

但我想知道是否有更好的方式做到这一点?感谢提前:)

+0

我不认为有两个不同的表,有两个集合列没有这个子查询的方式工作,所以我认为您的解决方案是确定的。 – Gregor 2012-01-28 16:21:39

+0

看看[这个答案](http://stackoverflow.com/a/5177386/944634) – 2012-01-28 16:24:39

+0

@ParagBafna:这是一个很好的做法,我注意到,它需要MySQL的布尔到整型的“促销”。 (我们不知道lam3r4370的RDBMS是这样做的。) – pilcrow 2012-01-28 16:28:06

回答

8

不就是做你的情况的正确方法。您的计数可能始终为0或1,并且可以从NC指数中得到满足。如果您要扫描更多的数据

,它可以更有效地做到这一点是这样的:

select sum(case when user = 'x' then 1 end) UserCount, sum(case when email = 'x' then 1 end) EmailCount 
from users 

这将始终扫描表。这取决于哪个版本更快的数据。就你而言,你的速度更快。

+0

您的解决方案比原始文章中提出的解决方案更糟糕。因为您的查询一旦完成表扫描,就没有where子句。 – 2013-02-01 15:44:55

+0

@arpf你是对的,因为表扫描总是会发生的(这是危险的,所以我在答案中把它叫出来)。不过,如果总是需要表扫描,我的版本会更好。另外,请注意第一句话 - 我提到这种折衷。 – usr 2013-02-01 16:14:11