MySQL Spalte "total" hinzufügen
Brauche ich zur Abfrage dieser DB zu bekommen jede Zeile, sondern auch die SUMME von einer der Werte in der Spalte der Ergebnisse. Könnte ich php benutzen, um die Summe Wert, aber dann würde ich brauchen, um zwei Schleifen, um die Summe (das geht oben über den Ergebnissen). Also ich würd lieber die Abfrage, um es zu fangen, und nur eine "Gesamt" - Zeile, aber die einzige Möglichkeit, die ich bekommen habe es auf der Arbeit ist mit einer Unterabfrage, die im wesentlichen eine Wiederholung der ursprünglichen Abfrage. Gibt es einen besseren Weg?
SELECT
CONCAT(u.firstname, ' ', u.lastname ) name, u.id, s.description, s.shiftstart, s.shiftend,
(SELECT
SUM( TIME_TO_SEC( TIMEDIFF( shiftend, shiftstart ) ) ) /3600
FROM shifts
WHERE id = '$user'
AND DATE( shiftstart )
BETWEEN '$start'
AND '$end') total
FROM shifts s
INNER JOIN users u ON ( s.id = u.id )
WHERE s.id = '$user'
AND DATE( shiftstart )
BETWEEN '$start'
AND '$end'
ORDER BY shiftstart
Den oben genannten Werken und Ausgänge:
name id description shiftstart shiftend total
Joe User joeuser Stuff 2009-01-05 07:45:00 2009-01-05 12:15:00 39.5000
Joe User joeuser Stuff 2009-01-05 13:00:00 2009-01-05 17:00:00 39.5000
Joe User joeuser Stuff 2009-01-06 07:45:00 2009-01-06 10:45:00 39.5000
Joe User joeuser Stuff 2009-01-06 10:45:00 2009-01-06 12:45:00 39.5000
Joe User joeuser Stuff 2009-01-06 13:30:00 2009-01-06 14:30:00 39.5000
Joe User joeuser Stuff 2009-01-06 14:30:00 2009-01-06 17:00:00 39.5000
Joe User joeuser Stuff 2009-01-07 09:45:00 2009-01-07 14:00:00 39.5000
Joe User joeuser Stuff 2009-01-07 15:00:00 2009-01-07 17:00:00 39.5000
Joe User joeuser Stuff 2009-01-08 08:00:00 2009-01-08 12:15:00 39.5000
Joe User joeuser Stuff 2009-01-08 13:15:00 2009-01-08 17:00:00 39.5000
Joe User joeuser Stuff 2009-01-09 07:45:00 2009-01-09 10:45:00 39.5000
Joe User joeuser Stuff 2009-01-09 11:45:00 2009-01-09 15:15:00 39.5000
Joe User joeuser Stuff 2009-01-09 15:15:00 2009-01-09 17:00:00 39.5000
Das ist, was ich brauche, aber wahrscheinlich nicht der beste Weg, um es zu bekommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
MySQL unterstützt eine spezielle Gruppe-von-Modifizierer genannt ROLLUP.
Der bessere Weg ist, um dies zu tun, mit code. Die Menschen halten das beharren auf die Verwendung von SQL, der relationalen algebra, die das tun, prozedurale Pflichten. Versuchen zum Schuhlöffel von Verfahrens-ness auf SQL ist immer eine schlechte Idee, sowohl in Bezug auf Komplexität und Leistung. Nehmen Sie diese Ratschläge von einem professionellen DBA.
Laufen zwei Abfragen aus dem code. Ausgabe die größere Anzahl der ersten, dann die gesamte Zeile in welchem format auch immer Sie wünschen. Ihre Anfragen werden kleiner und einfacher, Ihre Leistung zu verbessern und erhalten Sie die Ausgabe, die Sie wünschen.
Einige andere Beratung - Speicherplatz ist Billig und die meisten Datenbank-Tabellen gelesen werden, weit mehr als oft sind Sie geschrieben. Einrichten einer insert/update-trigger (wenn möglich in MySQL) zu füllen eine separate Spalte mit berechneten Feldern wie "
CONCAT(u.firstname,' ',u.lastname)
" und verwenden, die für die Abfragen. Pro-Zeile-Funktionen sind nicht skalierbar und töten Ihre DBMS-performance, es wird größer.Alles kann besser durch den Vergleich; die Frage ist-Vergleich zu dem, was, richtig?
Die zentrale Frage, die Sie angegeben, dass Sie wollten, dass die Gesamt an der Spitze der Ergebnisse; Crystal-Reports-Berichte und andere apps verwalten diese Art von Magie, indem Sie ein 2-pass-engine. Ersten Durchgang bekommt die Summen.
Gibt es trade-offs bei jeder Lösung. Wenn Sie eine separate "total" Reihe, dann die empfangende app, müssen Sie entweder entfernen Sie es, aus den Ergebnissen oder spielen einige andere trick, um es zu verstecken.
Eine Möglichkeit, die kann eine option sein, wenn Sie nicht schriftlich für eine 1 Millionen Treffer/hr-website, ist zu einfach machen 2 Anrufe -- eine für den overhead-Informationen, wie name, Gesamtzeit, etc., dann für die details ... Es scheint aus der Abfrage wählen Sie eine einzelne person, die Ergebnisse.
Sind wir alle für das speichern von overhead und Bandbreite, aber manchmal ist einfach besser ...
EDIT: Pax hat mich auf die "speichern" - button ... lol ...
Verwenden Sie die mysql-Erweiterung für genau diesen Zweck, wie beschrieben, in der Bill Karwin die Antwort (die ich habe mich von Ihnen positiv bewertet werden).
Wenn diese nicht verfügbar ist, option 2 wäre eine andere SQL-Anweisung: SELECT SUM ...) SQL wirklich optimiert ist äußerst effizient für diese Art der Sache, im Vergleich zu einer prozeduralen code-looping-du bist wahrscheinlich zu schreiben.