Bir sorguda birden çok sayım nasıl yapılır?


12

Kayıtları aşağıdaki gibi sorgularla sayıyorum

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

Her sayı için, mysql'in masa boyunca yürümesi gerekir ve bu uzun tablo ve çok sayıda sorgu varsa büyük bir sorundur.

Bir sorguda tüm sayıları yapmak için bir yol olup olmadığını merak ediyorum. Bu durumda, mysql her satır üzerinde yürüdüğünde, tüm sayıları işler ve tüm tabloyu tekrar tekrar taramaya gerek yoktur.


Doğru yanıtlara eklemek için önerilen sorgular tabloyu yalnızca bir kez tarar.

Yanıtlar:


21

Bunların her biri için bir sayı almak için deneyebilirsiniz

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

Aaron'ın çözümü gibi, daha kısa sözdizimi:

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

LIKE ifadesi bir boolean sonucu oluşturur. TRUEolduğu 1 , FALSEolduğu 0 yüzden, CASEgereksiz burada.


Çok temiz ve özlü - ancak sayımlar bir TINYINT'e sığmadığında ne olur - bir hata mı alıyorsunuz ya da bir tür dönüşüm gerçekleşiyor mu?
Jack diyor ki topanswers.xyz

TINYINTBu hikayede hayır yok . SUMne tür bir sayı olursa olsun (yüzer) ve sayısal bir sonuç üretir. Binlerce değer elde etmek için tür SUMsütunları kullanabilirsiniz TINYINT- bu bir sorun değildir.
Shlomi Noach

Tabii ki bool tinyint btw ile eşanlamlı biliyor musunuz?
Jack diyor ki topanswers.xyz

Evet dostum, bunu biliyorum. " TINYINTBu hikayede hayır yok " belki de başlangıç ​​için iyi bir cümle değildi.
Shlomi Noach

1
MS SQL Server'a özel bir cevap bulmak için buraya rastlayan herkese not, burada SUMbelirtilen işlev MS SQL Server'da aynı şekilde çalışmaz. Transct-SQL'de SUMyalnızca sayısal sütunlarla kullanılabilir.
user1451111

-1

İhtiyacınızı doğru alırsam bu belki de hile yapacak:

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

1
Muhtemelen peşinde olduğunuz Aarons anwser'a bakmak - birden fazla sayım elde etmek için - tüm sayımların toplamını değil.
JohnP
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.