web-dev-qa-db-ja.com

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

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

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が各行をウォークスルーすると、すべてのカウントが処理され、テーブル全体を何度もスキャンする必要がなくなります。

11
Googlebot

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

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`; 
20
Aaron W.

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

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

LIKE式はブール結果になります。 TRUE1FALSEはなので、CASEはここでは冗長です。

16
Shlomi Noach