Jak wykonać wiele zliczeń w jednym zapytaniu?

12

Liczę rekordy z zapytaniami takimi jak

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

Dla każdej liczby mysql musi przejrzeć całą tabelę, a to jest duży problem, jeśli mamy długi stół i liczne zapytania.

Zastanawiam się, czy istnieje sposób, aby wszystkie liczby były liczone w jednym zapytaniu. W takim przypadku, gdy mysql przechodzi nad każdym wierszem, przetworzy wszystkie liczby i nie trzeba skanować całej tabeli w kółko.

Googlebot
źródło
Aby dodać do poprawnych odpowiedzi, sugerowane zapytania skanują tabelę tylko raz.

Odpowiedzi:

21

Aby uzyskać liczbę dla każdego z nich, możesz spróbować

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.
źródło
16

Podobnie do rozwiązania Aarona, krótsza składnia:

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

Wyrażenie LIKE daje wynik logiczny. TRUEwynosi 1 , FALSEwynosi 0 , więc CASEtutaj jest zbędny.

Shlomi Noach
źródło
Bardzo schludne i zwięzłe - ale co się dzieje, gdy liczby nie pasują do TINYINT - pojawia się błąd lub występuje konwersja typu?
Jack mówi, że spróbuj topanswers.xyz
Nie ma TINYINTw tej historii. SUMpobiera dowolny typ liczby (nawet liczba zmiennoprzecinkowa) i daje wynik liczbowy. Możesz wpisać SUMkolumny TINYINTtypu, aby uzyskać wartości w tysiącach - to nie problem.
Shlomi Noach,
Wiesz oczywiście, że bool jest synonimem tinyint btw?
Jack mówi, że spróbuj topanswers.xyz
Tak, mój przyjacielu, wiem o tym. „Nie ma TINYINTw tej historii” być może nie było dobrym zdaniem na początek.
Shlomi Noach,
1
Uwaga dla każdego, kto natknie się tutaj na poszukiwanie odpowiedzi specyficznej dla MS SQL Server, SUMwspomniana tutaj funkcja nie działa w ten sam sposób w MS SQL Server. W języku Transct-SQL SUMmożna używać tylko z kolumnami numerycznymi.
user1451111
-1

Jeśli dobrze zrozumiem twoją potrzebę, może to załatwi sprawę:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
źródło
1
Patrząc na Aaronsa, który jest prawdopodobnie tym, czego szukasz - aby uzyskać wiele zliczeń - nie sumę wszystkich zliczeń.
JohnP