Ich brauche eine MySql-Anweisung, die alle Zeilen auswählt, sowie wie viele insgesamt Reihen gibt.
Wenn wörtlich genommen, ist dies nicht möglich. Das Ergebnis einer SQL-Abfrage ist eine (virtuelle) Tabelle. Die Spalte in jeder Zeile in dieser Ergebnistabelle liefert einen Wert, der nur dieser Zeile zugeordnet ist, und die Zeilen sind voneinander unabhängig.
Es gibt viele Möglichkeiten, die rowcount des gesamten Ergebnisses zu erfassen, aber es ist entweder in zwei Anweisungen oder mit einer Abfrage, die konzeptionell anders als das, was Sie haben, getan. (Lösungen unten)
Es gibt einen Aspekt in Ihrer ursprünglichen Frage, die auf vielfältige Weise interpretiert werden könnte:
sowie wie viele insgesamt Reihen gibt es
Dies entweder bedeuten könnte:
- Zählen Sie jede zurückgegebene Zeile im Ergebnis.
- jede Zeile Count, die zurückgegeben worden wäre, wenn es nicht für die LIMIT-Klausel (die das Ergebnis auf 5 Reihen in diesem Fall kürzt) war
(I sowohl unten mit Antworten kommen werde)
aber das gibt nur eine einzelne Zeile zurück. Ich vermute, es ist, weil COUNT (*) für jede Zeile gleich ist, und aus irgendeinem Grund gibt MySql nur Zeilen mit eindeutigen Werten dafür zurück? Ich habe keine Ahnung.
COUNT
ist eine Aggregatfunktion. Wenn Sie eine Aggregatfunktion verwenden, bitten Sie die Datenbank, Gruppen von Zeilen zusammenzufassen und einige Aspekte davon in eine einzelne Zeile zu projizieren. Was ist verwirrend ist, dass mysql auch Sie nicht-Aggregat und Aggregat Ausdrücke in der gleichen SELECT
Liste mischen. Die meisten anderen Datenbanken erlauben dies nicht und geben Ihnen einen Fehler, aber leider nicht MySQL.
Aber COUNT (*) nicht aggregiert jedoch immer noch alle Zeilen in eine einzige Zeile, die die gesamte Gruppe von Zeilen darstellt.
Auch wenn es eine bessere Möglichkeit gibt, die Summe als eine zusätzliche Spalte zu jeder Zeile hinzufügen, dann würde ich stattdessen möchten. Vielen Dank!
Ja, es gibt mehrere Möglichkeiten.
Wenn Sie die Anzahl der Zeilen bekommen zurückgegeben PHP, so, nachdem MySQL seine limit-Klausel angewendet wird, schlage ich vor, die PHP-Funktion mysql_num_rows
(http://www.php.net/manual/en/function.mysql-num-rows.php) nachdem ich die mysql_query
Anruf einfach anrufen.
Wenn Sie die Anzahl der Zeilen erhalten möchten, die in Abwesenheit der LIMIT
-Klausel zurückgegeben wurden, empfehle ich es in zwei Schritten durchzuführen: Führen Sie zunächst eine leicht modifizierte Version Ihrer ursprünglichen Abfrage und dann sofort danach aus das, rufen Sie die FOUND_ROWS
Funktion von MySQL. (Siehe http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows)
Es würde wie folgt aussehen:
$result = mysql_query('SELECT SQL_CALC_FOUND_ROWS * FROM posts LIMIT 0, 5');
//do stuff with the result, but don't do any other queries
//get the total number of rows (disregarding the LIMIT clause)
$result = mysql_query('SELECT FOUND_ROWS()');
Die SQL_CALC_FOUND_ROWS
Modifikator MySQL Spur der Gesamtzahl der Zeilen zu halten, sagt vor der LIMIT
Klausel anzuwenden und FOUND_ROWS()
kehrt diese Zahl. Halten Sie 2 Dinge beachten:
- beide
mysql_query
Anrufe über die gleiche Verbindung ausgeführt werden soll
- Sie eine weitere Abfrage dazwischen diese Anrufe zu
mysql_query
Oh, letzte Bemerkung nicht ausgeführt werden: bei der Verwendung von LIMIT
, möchten Sie in der Regel die Ergebnisse in einer bestimmten Weise bestellt werden. Normalerweise verwenden Leute LIMIT
für Seitenumbruch. Wenn Sie nicht die Zeilen bestellen, ist die Reihenfolge unbestimmt und nachfolgende Abfragen von früheren Aussagen zurückgeben, zurückgegebenen Zeilen bereits selbst wenn der Offset LIMIT
unterscheidet. Sie können explizit das Ergebnis bestellen, indem eine ORDER BY
-Klausel. (http://dev.mysql.com/doc/refman/5.5/en/select.html)
Wenn Sie PHP verwenden, warum nicht 'mysql_num_rows' – hjpotter92
@ hjpotter92 verwenden, aber es hängt davon ab, welche" totale "OP denkt. Summe aktuell ausgewählt (als "mysql_num_rows" ist in Ordnung) oder Anzahl der Zeilen in der gesamten Tabelle. –
Guter Punkt, @Michal. Ich habe beide Fälle in meiner Antwort angesprochen. –