2012-04-06 4 views
1

Ich versuche die Anzahl der Spiele zu ermitteln, die Beschwörer in der Warteschlange heute gespielt haben. Ich habe mehrere Abfragen ausprobiert. Der nächste, den ich bekommen habe, ist:Anzahl der Spiele, die ein bestimmter Benutzer heute gespielt hat, wo es keine Daten gibt

SELECT 
     s.summoner, 
     s.wins, 
     COUNT(*) as playedToday 
    FROM summoners s 
    LEFT JOIN teams_players tp ON tp.summoner_id = s.summoner 
    LEFT JOIN teams t ON t.id = tp.team_id 
    LEFT JOIN matches b ON t.id = b.blue_id 
    WHERE 
     b.played_on = DATE(NOW()) 
     s.in_queue; 

Aber das gibt nicht die Anzahl pro Benutzer. Es erhält nur die Gesamtanzahl.

Keine der Tabellen enthält Daten zu einem der Beschwörer. Was ich möchte, ist so etwas wie:

+-----------------+------+-------------+ 
    | summoner  | wins | gamesPlayed | 
    +-----------------+------+-------------+ 
    | DotAliscious | 353 |   0 | 
    | Kraator   | 440 |   0 | 
    | Nammon   | 667 |   0 | 
    | VictorousSecret | 843 |   0 | 
    | Canas   | 544 |   0 | 
    | Sprognak  | 502 |   0 | 
    | Ghostilocks  | 808 |   0 | 
    | b0b d0e   | 224 |   0 | 
    | Metroshica  | 339 |   0 | 
    | RubenatorX  | 478 |   0 | 
    +-----------------+------+-------------+ 

Ich kann nicht glauben, wie dieses Problem allgemein auszudrücken, weshalb ich nicht eine Lösung gefunden haben.


Mein Datensatz. Beachten Sie, dass teams.id mit matches.blue_id und matches.purple_id übereinstimmt.

mysql> DESCRIBE summoners; 
+--------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+--------------+-------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| icon   | int(11)  | NO |  | 0  |    | 
| summoner  | varchar(32) | NO | UNI | NULL |    | 
| skype  | varchar(32) | NO |  | NULL |    | 
| email  | varchar(32) | NO |  | NULL |    | 
| in_queue  | tinyint(1) | NO |  | 0  |    | 
| wins   | int(11)  | NO |  | 0  |    | 
| level  | int(11)  | NO |  | 1  |    | 
| lan_wins  | int(11)  | NO |  | 0  |    | 
| played_today | int(11)  | NO |  | 0  |    | 
+--------------+-------------+------+-----+---------+----------------+ 
10 rows in set (0.00 sec) 

mysql> DESCRIBE matches; 
+-----------+-------------+------+-----+---------------------+----------------+ 
| Field  | Type  | Null | Key | Default    | Extra   | 
+-----------+-------------+------+-----+---------------------+----------------+ 
| id  | int(11)  | NO | PRI | NULL    | auto_increment | 
| blue_id | int(11)  | NO | MUL | NULL    |    | 
| purple_id | int(11)  | NO | MUL | NULL    |    | 
| status | varchar(32) | NO |  | display    |    | 
| played_on | datetime | NO |  | 2012-04-06 13:53:55 |    | 
+-----------+-------------+------+-----+---------------------+----------------+ 
5 rows in set (0.00 sec) 

mysql> DESCRIBE teams; 
+---------+-------------+------+-----+------------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+---------+-------------+------+-----+------------+----------------+ 
| id  | int(11)  | NO | PRI | NULL  | auto_increment | 
| outcome | varchar(32) | NO |  | incomplete |    | 
+---------+-------------+------+-----+------------+----------------+ 
2 rows in set (0.00 sec) 

mysql> DESCRIBE teams_players; 
+-------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+-------------+---------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| team_id  | int(11) | NO | MUL | NULL |    | 
| summoner_id | int(11) | NO | MUL | NULL |    | 
+-------------+---------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

Antwort

1

Ihre played_on ist datetime und Sie es mit date vielleicht vergleichen, das ist Ihr Problem. Sie sollten versuchen:

WHERE 
    DATE(b.played_on) = DATE(NOW()) 

Auch was meinst du mit s.in_queue? Hast du das UND vergessen? Meinst du

WHERE 
    DATE(b.played_on) = DATE(NOW()) 
    AND 
    s.in_queue; 
1

Sie gehen zu wollen, einen subselect verwenden, um die Anzahl der Datensätze zu erhalten, die die Bedingung erfüllen, und das wird zurückkehren Sie eine 0, wenn die Bedingung falsch ist. Etwas nach dem Vorbild von

(SELECT COUNT(*) FROM matches b WHERE b.blue_id = t.id AND b.played_on = DATE(NOW())) AS playedToday 

und Sie werden die LEFT JOIN zum matches Tabelle und der WHERE Klausel überprüft das Datum entfernen möchten.

Verwandte Themen