2016-06-10 6 views
0

Also ich bin mit dieser sehr (sehr) grundlegende MySQL-Abfrage, die courrier Datensätze abgerufen werden soll nach der Anzahl der verbundenen reaction s.Warum gibt SELECT COUNT() eine aggregierte Zahl zurück, wenn ich eine Zählung für jede Zeile erwarte?

Ich habe diese Tabelle:

mysql> describe courrier; 
+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name   | varchar(255) | NO |  | NULL |    | 
| envoi  | datetime  | NO |  | NULL |    | 
| intro  | longtext  | NO |  | NULL |    | 
| courrier  | longtext  | NO |  | NULL |    | 
| slug   | varchar(255) | NO |  | NULL |    | 
| categorie_id | int(11)  | YES | MUL | NULL |    | 
| reponse  | longtext  | YES |  | NULL |    | 
| recu   | datetime  | YES |  | NULL |    | 
| published | tinyint(1) | NO |  | NULL |    | 
| image_id  | int(11)  | YES | UNI | NULL |    | 
| like_count | int(11)  | YES |  | NULL |    | 
+--------------+--------------+------+-----+---------+----------------+ 
12 rows in set (0.02 sec) 

Welche hat:

mysql> select count(id) from courrier; 
+-----------+ 
| count(id) | 
+-----------+ 
|  56 | 
+-----------+ 
1 row in set (0.00 sec) 

Registriert mit:

mysql> describe reaction; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| courrier_id | int(11)  | YES | MUL | NULL |    | 
| date  | datetime  | NO |  | NULL |    | 
| ip   | varchar(15) | NO |  | NULL |    | 
| reaction | longtext  | NO |  | NULL |    | 
| url   | varchar(255) | YES |  | NULL |    | 
| name  | varchar(255) | NO |  | NULL |    | 
| status  | int(11)  | NO |  | NULL |    | 
| email  | varchar(255) | YES |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 
9 rows in set (0.01 sec) 

Welche hat:

mysql> select count(id) from reaction; 
+-----------+ 
| count(id) | 
+-----------+ 
|  236 | 
+-----------+ 
1 row in set (0.00 sec) 

On: So ALTER TABLE reaction ADD CONSTRAINT FK_5DA165A18BF41DC7 FOREIGN KEY (courrier_id) REFERENCES courrier (id);

(Backticks zur besseren Lesbarkeit entfernt)

, wenn ich diese Abfrage ausführen:

SELECT c0_.id AS id_0, 
     c0_.name AS name_1, 
     c0_.slug AS slug_2, 
     c0_.envoi AS envoi_3, 
     c0_.intro AS intro_4, 
     c0_.courrier AS courrier_5, 
     c0_.reponse AS reponse_6, 
     c0_.published AS published_7, 
     c0_.like_count AS like_count_8, 
     c0_.recu AS recu_9, 
     COUNT(r1_.id) AS sclr_10, 
     c0_.image_id AS image_id_11, 
     c0_.categorie_id AS categorie_id_12 
    FROM courrier c0_ 
INNER JOIN reaction r1_ ON c0_.id = r1_.courrier_id 
ORDER BY sclr_10 DESC LIMIT 25 

Ich bin ganz natürlich mit einer Zeile pro Datensatz zur Verfügung gestellt werden erwartet in courrier zusammen mit einer zusätzlichen Spalte, die die Anzahl der verbundenen reaction Datensätze angibt.

Aber ich bin zurück: 1 row in set (0.03 sec). Es ist der erste Datensatz in courrier eingefügt und die zusätzliche Spalte ist mit der Nummer 242 gefüllt.

Was habe ich falsch gemacht?

+0

Verwenden Sie die Gruppe von, die Spalte, die Sie zählen möchten –

+0

Beachten Sie auch, dass es sehr schlecht ist, Spalten ohne Aggregatfunktionen auf ihnen beim Gruppieren zu haben, obwohl MySQL es erlaubt. Es kann in vielen Fällen zu zufälligen Ergebnissen führen, obwohl diese keine haben sollte. –

Antwort

3

sollten Sie verwenden eine group by Klausel, da sonst die count wird die gesamte Ergebnismenge zusammenfassen:

SELECT  c0_.id AS id_0 /*, ...*/, 
      COUNT(r1_.id) AS sclr_10 
FROM  courrier c0_ 
INNER JOIN reaction r1_ ON c0_.id = r1_.courrier_id 
GROUP BY c0_.id 
ORDER BY sclr_10 DESC 
LIMIT  25 

Hinweis: Wenn Sie auch in courrier Aufzeichnungen interessiert sind, die keinen entsprechenden Datensatz in Reaktion haben (count = 0), dann LEFT JOIN anstelle von INNER JOIN verwenden.

+0

Ja! Das hat den Trick gemacht! Danke vielmals! – D4V1D

Verwandte Themen