2012-01-28 33 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