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.


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

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.


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;

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.