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?
Verwenden Sie die Gruppe von, die Spalte, die Sie zählen möchten –
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. –