2016-06-22 13 views
1

Hier ist die Frage: Ich habe eine Tabelle, die wie folgt aussieht (vereinfacht)mySQL ORDER BY SUM Doppel GROUP BY, Gruppen erhalten

+------+------+------+ 
| res | loc | rent | 
+------+------+------+ 
| WEB | WP | 100 | 
| WEB | VA | 300 | 
| VR | WP | 500 | 
| VR | VA | 200 | 
| VR | VA | 600 | 
| CS | WP | 400 | 
| CS | WP | 90 | 
+------+------+------+ 

Ich kann die Tabelle wie folgt mit SELECT res zu sehen bekommen, loc , SUM (Miete) FROM testTable GROUP BY res, loc;

+------+------+-----------+ 
| res | loc | SUM(rent) | 
+------+------+-----------+ 
| CS | WP |  490 | 
| VR | VA |  800 | 
| VR | WP |  500 | 
| WEB | VA |  300 | 
| WEB | WP |  100 | 
+------+------+-----------+ 

Was ich von hier will, ist die Tabelle mit VR zuerst zu bestellen (weil seine Gesamtmiete größter ist), dann CS, dann, WEB, aber ich mag auch Gruppe erhalten, um so es so aussehen würde

+------+------+-----------+ 
| res | loc | SUM(rent) | 
+------+------+-----------+ 
| VR | VA |  800 | 
| VR | WP |  500 | 
| CS | WP |  490 | 
| WEB | VA |  300 | 
| WEB | WP |  100 | 
+------+------+-----------+ 

diese Weise können sie mieten gruppiert nach Ort zusammengefasst sind und dann durch größte Miete insgesamt bestellt und dann durch Miete innerhalb dieser Miete insgesamt bestellt. VR ist oberste Ursache (800 + 500)> 490> (300 + 100) und loc VA kommt vor WP in der VR-Gruppe weil 800> 500.

Ist das möglich ich träume zu groß?

Antwort

0

Sie müssen die Summe für die res Werte separat in einer Unterabfrage berechnen, etwa so:

SELECT t.res, t.loc, SUM(t.rent) AS reslocRent 
FROM table AS t 
INNER JOIN (
    SELECT res, SUM(rent) AS resRent 
    FROM table 
    GROUP BY res 
) AS subQ ON t.res = subQ.res 
GROUP BY t.res, t.loc 
ORDER BY subQ.resRent DESC, reslocRent DESC 
+0

Super, genau das, was ich wollte, danke. Allerdings habe ich einen erweiterten Teil zu meiner Frage: Ist es mir möglich, etwas wie LIMIT 2 zu machen und so eine Tabelle wie nur mit den beiden obersten res (VR und CS) zurückgeben zu können? – Taylor

+1

Wenn LIMIT 2 zur Unterabfrage hinzugefügt wird, sollte es auf die beiden obersten Res beschränkt werden (aufgrund des ** inneren ** Joins), aber immer noch alle ihre Loksummen anzeigen; Wenn Sie nur die höchsten Locs der Liste res wollen, setzen Sie das Limit 2 ganz am Ende der gesamten Abfrage. – Uueerdo

+0

Der obige Kommentar sollte sagen _wenn Sie nur die höchsten Locs der ** höchsten ** res_ wollen – Uueerdo

0

Es scheint, wie alles, was Sie brauchen, um ORDER BY ist die Summe der rent in absteigender Reihenfolge:

SELECT res, loc, SUM(rent) 
FROM testTable 
GROUP BY res, loc 
ORDER BY SUM(rent) DESC