Bagaimana cara membuat banyak penghitungan dalam satu permintaan?

11

Saya menghitung catatan dengan pertanyaan seperti

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%'

Untuk setiap hitungan, mysql perlu menelusuri tabel, dan ini adalah masalah besar jika memiliki meja panjang dan banyak kueri.

Saya ingin tahu apakah ada cara untuk membuat semua perhitungan dalam satu permintaan. Dalam hal ini, ketika mysql berjalan di setiap baris, itu akan memproses semua jumlah, dan tidak perlu memindai seluruh tabel berulang-ulang.

Googlebot
sumber
Untuk menambahkan jawaban yang benar, kueri yang disarankan hanya memindai tabel sekali.

Jawaban:

20

Untuk mendapatkan hitungan untuk masing-masing yang dapat Anda coba

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

Mirip dengan Aaron's solutio, sintaksis lebih pendek:

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

Ekspresi LIKE membuat hasil boolean. TRUEadalah 1 , FALSEadalah 0 , jadi CASEberlebihan di sini.

Shlomi Noach
sumber
Sangat rapi dan ringkas - tetapi apa yang terjadi ketika penghitungan tidak cocok dengan TINYINT - apakah Anda mendapatkan kesalahan atau apakah terjadi semacam konversi tipe?
Jack bilang coba topanswers.xyz
Tidak ada TINYINTdalam cerita ini. SUMmengambil jenis nomor apa pun (bahkan float) dan menghasilkan hasil numerik. Anda bisa SUMkolom TINYINTtipe untuk mendapatkan nilai dalam ribuan - itu tidak masalah.
Shlomi Noach
Anda tentu tahu bahwa bool identik dengan tinyint btw?
Jack bilang coba topanswers.xyz
Ya, temanku, aku tahu itu. "Tidak ada TINYINTdalam cerita ini" mungkin bukan kalimat yang baik untuk memulai.
Shlomi Noach
1
Catatan untuk siapa saja yang menemukan di sini untuk mencari jawaban spesifik MS SQL Server, SUMfungsi seperti yang disebutkan di sini tidak bekerja dengan cara yang sama di MS SQL Server. Dalam Transct-SQL SUMdapat digunakan dengan kolom numerik saja.
user1451111
-1

Jika saya mendapatkan kebutuhan Anda dengan benar, ini mungkin akan melakukan trik:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
sumber
1
Melihat Aarons anwser yang mungkin adalah apa yang Anda cari - untuk mendapatkan beberapa hitungan - bukan jumlah dari semua jumlah.
JohnP