2012-05-14 18 views
6

Ich möchte zwei Dinge unter verschiedenen Bedingungen in einer Abfrage zählen.MySQL - Zählen zweier Dinge mit unterschiedlichen Bedingungen

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 

und

SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 

Ich brauchen eine Zählung für Reihen haben, die eine bestimmte Adresse und bestimmt Port hat, und eine separate Zählung für die Zeilen, die einen bestimmten Namen haben.

Ich bin mir bewusst, dass ich

SELECT (COUNT*) as count FROM table_name WHERE (address = ? AND port = ?) OR name = ? 

tun könnte jedoch, dass eine einzige Zählung ist, und ich brauche sie getrennt zu sein, damit ich kann den Benutzer eine genauere Nachricht angezeigt werden soll.

Wie kann ich das machen? Hilfe wäre willkommen!

Antwort

19

Was ist einfach:

SELECT 
    SUM(IF(name = ?, 1, 0)) AS name_count, 
    SUM(IF(address = ? AND port = ?, 1, 0)) AS addr_count 
FROM 
    table_name 
+0

Ich denke, das wäre etwa das gleiche wie Bobwienholt in Bedingungen der Leistung, aber wenn eine von 'Name',' Adresse' oder 'Port' indiziert wird, kann es auch schneller sein, diese Bedingungen der WHERE-Klausel hinzuzufügen:' WHERE name =? ODER (Adresse =?UND port =?) ' –

4
SELECT SUM(CASE WHEN Name = ? THEN 1 ELSE 0 END) as name_match 
     , SUM(CASE WHEN Address = ? AND Port = ? THEN 1 ELSE 0 END) as address_match 
FROM table_name 
WHERE (address = ? AND port = ?) OR name = ? 
+0

Von dem, was ich sagen kann, würde diese Abfrage schneller sein als die beiden anderen Lösungen. Würdest du zustimmen? – fruitcup

2

könnte am einfachsten, nur eine Union zu tun:

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 
    GROUP BY name 
UNION ALL 
SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ? 
    GROUP BY address, port 
+0

Ich habe vorher noch nie eine UNION benutzt, aber ich denke, dass @ bobwienholts Anfrage schneller wäre. Was denken Sie? – fruitcup

+2

@DrAgonmoray Es ist eine gute Frage, und ich weiß nicht wirklich ... Ich bin eigentlich geneigt zu denken, dass dieser Weg schneller wäre ** wenn ** es einen Index auf * Name * sowie * Adresse * oder * gibt Hafen*. Count ist sehr schnell für eine indizierte Spalte, während das Hinzufügen einer case-Anweisung möglicherweise einen Scan aller Zeilen erfordert. YMMV :) – McGarnagle

+1

Ich neige dazu, mit dBemans Einschätzung zuzustimmen. Allerdings verwende ich meine Methode in Abfragen, bei denen die WHERE-Klausel nach Spalten sucht, die sich von denen unterscheiden, in denen ich Werte zähle. In diesem Fall wäre meine Methode wahrscheinlich schneller. – bobwienholt

Verwandte Themen