2012-05-14 12 views
6

1つのクエリで異なる条件で2つのものを数えたいと思います。MySQL - 条件が異なる2つのものを数える

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 

SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 

私は、特定のアドレスや特定のポートを持っている行の数、および特定の名前を持つ行のSEPARATE数を持っている必要があります。

私は、単一のカウントである、と私は、ユーザーに、より正確なメッセージを表示することができますので、それらを別々である必要がしかし、私は

SELECT (COUNT*) as count FROM table_name WHERE (address = ? AND port = ?) OR name = ? 

を行うことができることを知っています。

これを行うにはどうすればよいですか?助けていただければ幸いです!単にについて

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 
    GROUP BY name 
UNION ALL 
SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 
    GROUP BY address, port 

答えて

19

何:

+0

これはbobwienholtのしかし、 'name'、' address'、 'port'のいずれかが索引付けされていれば、WHERE句にこれらの条件を追加する方が速いかもしれません。 OR(アドレス=?AND port =?) ' –

4
SELECT SUM(CASE WHEN Name = ? THEN 1 ELSE 0 END) as name_match 
     , SUM(CASE WHEN Address = ? AND Port = ? THEN 1 ELSE 0 END) as address_match 
FROM table_name 
WHERE (address = ? AND port = ?) OR name = ? 
+0

私が言うことができるものから、このクエリは、他の2つよりも速いだろうソリューション。同意しますか? – fruitcup

2

がちょうど連合を行うには最も簡単なことかもしれません

SELECT 
    SUM(IF(name = ?, 1, 0)) AS name_count, 
    SUM(IF(address = ? AND port = ?, 1, 0)) AS addr_count 
FROM 
    table_name 
+0

私は以前にUNIONを使ったことはありませんでしたが、私は@ bobwienholtのクエリがより速くなると考えています。どう思いますか? – fruitcup

+2

@DrAgonmorayこれは良い質問ですが、私は実際にはわかりません...私は実際にこの方法がもっと速くなると思う傾向があります**もし** name *と* address *または*ポート*。インデックス付き列の場合は非常に高速ですが、case文を追加する場合はすべての行をスキャンする必要があります。 YMMV :) – McGarnagle

+1

私はdbasemanの評価に同意する傾向があります。しかし、私はWHERE句が値を数えているものとは異なる列を見ているクエリで自分のメソッドを使う傾向があります。その場合、私のメソッドはおそらくもっと速くなります。 – bobwienholt

関連する問題