Wie mache ich mehrere Zählungen in einer Abfrage?

11

Ich zähle Datensätze mit Abfragen wie

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

Für jede Zählung muss MySQL die Tabelle durchlaufen, und dies ist ein großes Problem, wenn eine lange Tabelle und zahlreiche Abfragen vorhanden sind.

Ich frage mich, ob es eine Möglichkeit gibt, alle Zählungen in einer Abfrage durchzuführen. In diesem Fall werden alle Zählungen verarbeitet, wenn MySQL über jede Zeile läuft, und es ist nicht erforderlich, die gesamte Tabelle immer wieder zu scannen.

Googlebot
quelle
Um die richtigen Antworten zu ergänzen, scannen die vorgeschlagenen Abfragen die Tabelle nur einmal.

Antworten:

20

Um eine Zählung für jeden von denen zu erhalten, können Sie versuchen

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.
quelle
16

Ähnlich wie bei Aarons Lösung, kürzere Syntax:

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

Der LIKE-Ausdruck ergibt ein boolesches Ergebnis. TRUEist 1 , FALSEist 0 , also CASEist das hier redundant.

Shlomi Noach
quelle
Sehr ordentlich und prägnant - aber was passiert, wenn die Zählungen nicht in einen TINYINT passen - erhalten Sie einen Fehler oder findet eine Art Typkonvertierung statt?
Jack sagt, versuchen Sie es mit topanswers.xyz
Es gibt keine TINYINTin dieser Geschichte. SUMNimmt jede Art von Zahl (sogar float) und erzeugt ein numerisches Ergebnis. Sie können SUMSpalten vom TINYINTTyp verwenden, um Werte in Tausenden zu erhalten - das ist kein Problem.
Shlomi Noach
Sie wissen natürlich, dass Bool übrigens gleichbedeutend mit tinyint ist?
Jack sagt, versuchen Sie es mit topanswers.xyz
Ja, mein Freund, das weiß ich. Das "Es gibt kein TINYINTin dieser Geschichte" war vielleicht kein guter Satz, um damit zu beginnen.
Shlomi Noach
1
Ein Hinweis für alle, die hier auf der Suche nach einer MS SQL Server-spezifischen Antwort stolpern. Die hier SUMerwähnte Funktion funktioniert in MS SQL Server nicht auf die gleiche Weise. In Transct-SQL SUMkann nur mit numerischen Spalten verwendet werden.
user1451111
-1

Wenn ich Ihr Bedürfnis richtig verstehe, reicht dies möglicherweise aus:

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;
JohnP
quelle
1
Wenn Sie sich Aarons Antwort ansehen, ist das wahrscheinlich das, wonach Sie suchen - um mehrere Zählungen zu erhalten - nicht die Summe aller Zählungen.
JohnP