|
|
|
|
[SQL] Abfrage nach mehreren Kriterien gruppieren |
Misel
Hüter des Kitkat
Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d
e
|
|
[SQL] Abfrage nach mehreren Kriterien gruppieren |
|
Hallo,
der Titel ist ein wenig verwirrend, da ich selbst nicht so genau weiß, wie man das nennt, was ich will. Wüsste ich das, hätte ich es vielleicht schon über Google gefunden.
Ich habe eine Tabelle in ähnlicher Struktur wie dieser:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
day | player | village | population
-------------------------------------------
2008-01-30 | Misel | dorf1 | 30
2008-01-30 | Misel | dorf2 | 40
2008-01-30 | Misel | dorf3 | 50
2008-01-30 | LX | dorf4 | 50
2008-01-30 | LX | dorf5 | 70
2008-01-29 | Misel | dorf1 | 25
2008-01-29 | Misel | dorf2 | 35
2008-01-29 | Misel | dorf3 | 45
2008-01-29 | LX | dorf4 | 40
2008-01-29 | LX | dorf5 | 60
2008-01-28 | Misel | dorf1 | 15
2008-01-28 | Misel | dorf2 | 25
2008-01-28 | LX | dorf4 | 30
2008-01-28 | LX | dorf5 | 40 |
|
Wenn ich zum Beispiel den Verlauf meiner Bevölkerung über die Zeit darstellen möchte, nehme ich folgendes SQL-Statement:
code: |
1:
2:
3:
4:
5:
|
SELECT day, sum(population)
FROM world
WHERE player = 'Misel'
GROUP BY day
ORDER BY day |
|
Damit habe ich für jeden Tag die Summer der Bevölkerung meiner Dörfer.
Soweit so gut - jetzt möchte ich aber gerne die Bevölkerung mehrerer Spieler gegenüberstellen, und das möglichst ohne mehrere Abfragen.
Ist es möglich, die Abfrage so zu modifizieren, dass die Spieler in einer Spalte stehen, statt in einer Reihe?
Idealerweise sähe das Ergebnis dann so aus:
code: |
1:
2:
3:
4:
5:
|
day | Misel | LX
-------------------------
2008-01-30 | 120 | 120
2008-01-29 | 105 | 100
2008-01-28 | 40 | 70 |
|
Ist das überhaupt möglich? Brauche ich dazu evtl. Sub-Statements?
__________________ LAUFT! Ich spiele KILLERSPIELE!
|
|
30.01.2008 21:36 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
AFAIK nein, da in den Spalten ja die Feldnamen sind.
Du könntest höchstens die Spielerspalte sortieren, und nach Tagen gruppieren.
phlox
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
30.01.2008 21:52 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
Hm, falls es nicht allzuspät ist:
sowas würde gehen:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
SELECT misel.day, SUM (misel.population) as 'Misel', SUM (lx.population) as 'LX'
FROM
(SELECT day, population FROM world WHERE player='Misel') misel,
(SELECT day, population FROM world WHERE player='LX') lx,
WHERE misel.day=lx.day
GROUP BY misel.day;
|
|
intuitiver würde ich allerdings sagen, dass Spaltenhinzufügen nach einem (Teta) Join "schreit":
code: |
1:
2:
3:
4:
5:
6:
|
SELECT misel.day,SUM (misel.population) as 'Misel', SUM (lx.population) as 'LX'
FROM
world misel INNER JOIN world lx (ON lx.day=misel.day AND misel.player='Misel' AND lx.player='lx')
GROUP BY misel.day;
|
|
das erste Statement habe ich zumindest sinngemäßt getestet, das letzte sollte aber auch stimmen
Edit: Huch, schau sich mal einer das Registrierungsdatum der ganzen alten Säcke in dem Thread an
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von CDW: 10.02.2008 01:50.
|
|
10.02.2008 01:49 |
|
|
Misel
Hüter des Kitkat
Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d
e
Themenstarter
|
|
Ja, das wäre für diesen speziellen Fall die Lösung. Aber es gibt noch wesentlich mehr Spieler (so um die 14k), die ich da mitreinnehmen will. Natürlich nicht alle auf einmal, das ist auch klar, aber doch ein paar (so bis zu 60).
__________________ LAUFT! Ich spiele KILLERSPIELE!
|
|
10.02.2008 10:43 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
Hm, sicherlich könnte man das mit Joins mehr oder weniger gut lösen.
(zuerst z.b 60 Spieler lesen und dann ein entsprechendes Statement generieren).
Aber ich glaube bei 14k Spieler sollte man es lieber nicht machen.
Es gibt allerdings, je nach DB auch "Prepaired" SQL Statements (http://de.wikipedia.org/wiki/Prepared_Statement). Ich hab das so gelernt, dass der Vorteil nicht nur darin besteht, dass das Statement nur 1 mal geparst werden muss (danach werden immer nur die Platzhalter eingesetzt) sondern auch das ganze interne Anfrageoprimierungsgedöns wird nur einmal für die Anfrage ausgeführt (bei der Übersetzung) und dann entfällt es.
D.h: eventuell wird die Lösung mit mehrere Anfragen (z.B in einer Schleife für x Spieler) dann tragbar(er).
|
|
10.02.2008 12:38 |
|
|
|
|
|
|