2017-01-04 1 views
0

Ich teste eine Möglichkeit, zwei verschiedene Dinge aus einer einzigen MySQL-Tabelle zu zählen.einfachste Möglichkeit, zwei verschiedene Dinge in einer MySQL-Abfrage zu zählen

Es wird überprüft, ob Spieleschlüssel beansprucht wurden, also kann ich einen Zähler der behaupteten/total auf einer Seite tun.

SELECT 
    (SELECT COUNT(`id`) FROM `game_giveaways_keys` WHERE `claimed` = 1 AND `game_id` = 3) as `claimed`, 
    (SELECT COUNT(`id`) FROM `game_giveaways_keys` WHERE `game_id` = 3) as `total` 
FROM game_giveaways_keys 
LIMIT 1 

Wenn ich nicht hinzufügen „LIMIT 1“ zeigt er mir das gleiche behauptet/insgesamt in so viele Zeilen wie Tasten sind, bin ich richtig es nur 1 Zeile zu begrenzen, oder gibt es eine bessere Weg, um die Informationen, die ich will, in nur 1 Reihe zu beginnen mit?

+2

Sie brauchen nichts von 'FROM ...' –

+0

Hah, das warum dann wäre, dass es sortiert. Ich habe einige Informationen über Unterabfragen verfolgt und sie hatten alle am Ende. – NaughtySquid

Antwort

4

Verwendung bedingte Aggregation:

SELECT SUM(CASE WHEN claimed = 1 AND game_id = 3 THEN 1 ELSE 0 END) AS claimed, 
     SUM(CASE WHEN game_id = 3 THEN 1 ELSE 0 END) AS total 
FROM game_giveaways_keys 

Dies könnte auch vereinfacht werden:

SELECT SUM(CASE WHEN claimed = 1 THEN 1 ELSE 0 END) AS claimed, 
     COUNT(*) AS total 
FROM game_giveaways_keys 
WHERE game_id = 3 

Beiden Fragen haben einen Vorteil gegenüber Ihrem ursprünglichen Ansatz, dass sie benötigen nur einen einzigen Scan, während Die Verwendung von zwei separaten Unterabfragen erfordert mindestens zwei vollständige Tabellen-Scans.

+0

Oh schön, das ist eine wirklich coole Art, es zu tun. Weniger Table Scans sind immer großartig, danke! – NaughtySquid

1

Sie müssen nichts nach FROM geben. Ihre vollständige Abfrage sollte nur sein:

SELECT 
    (SELECT COUNT(`id`) FROM `game_giveaways_keys` WHERE `claimed` = 1 AND `game_id` = 3) as `claimed`, 
    (SELECT COUNT(`id`) FROM `game_giveaways_keys` WHERE `game_id` = 3) as `total` 
Verwandte Themen