1つのクエリで複数のカウントを行う方法は?


11

次のようなクエリでレコードを数えます

SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'

カウントごとに、mysqlはテーブル全体をウォークスルーする必要があり、これは長いテーブルと多数のクエリがある場合の大きな問題です。

1つのクエリですべてのカウントを行う方法はあるのでしょうか。この場合、mysqlが各行をウォークスルーすると、すべてのカウントが処理されるため、テーブル全体を何度もスキャンする必要がありません。


正しい回答に追加するために、提案されたクエリはテーブルを1回だけスキャンします。

回答:


20

あなたが試すことができるそれらのそれぞれの数を取得するには

SELECT
    COUNT(CASE WHEN `col1` LIKE '%something%' THEN 1 END) AS count1,
    COUNT(CASE WHEN `col1` LIKE '%another%' THEN 1 END) AS count2,
    COUNT(CASE WHEN `col1` LIKE '%word%' THEN 1 END) AS count3
FROM `table1`; 

16

アーロンのsolutioと同様に、短い構文:

SELECT
    SUM(col1 LIKE '%something%') AS count1,
    SUM(col1 LIKE '%another%') AS count2,
    SUM(col1 LIKE '%word%') AS count3
FROM `table1`

LIKE式はブール結果になります。TRUEある1FALSEである0、そうCASEここに冗長です。


非常に簡潔で簡潔ですが、カウントがTINYINTに収まらない場合はどうなりますか?エラーが発生するか、なんらかの型変換が発生しますか?
ジャックはtopanswers.xyzしようと言う

TINYINTこの話には何もありません。SUMどんなタイプの数値でも(浮動小数点であっても)受け取り、数値結果を生成します。タイプのSUM列でTINYINT数千の値を取得できます。これは問題ではありません。
Shlomi Noach

もちろん、boolがtinyint btwと同義であることを知っていますか?
ジャックはtopanswers.xyzを試してみると12

はい、私の友人、私はそれを知っています。「TINYINTこの物語には何もありません」は、おそらく最初から良い文ではなかったでしょう。
Shlomi Noach、2012

1
MS SQL Server固有の答えを探してここで偶然見つけた人へのメモ、ここでSUM述べた機能はMS SQL Serverでは同じようには機能しません。Transct-SQLではSUM、数値列でのみ使用できます。
user1451111

-1

私があなたの必要性を正しく理解していれば、おそらくこれでうまくいくでしょう:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;

1
すべてのカウントの合計ではなく、複数のカウントを取得するために、おそらくAarons anwserを探しています。
JohnP 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.