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.


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`; 

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.


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;

1
Melihat Aarons anwser yang mungkin adalah apa yang Anda cari - untuk mendapatkan beberapa hitungan - bukan jumlah dari semua jumlah.
JohnP
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.