BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- [SQL] Abfrage nach mehreren Kriterien gruppieren (http://www.black-board.net/thread.php?threadid=23179)


Geschrieben von Misel am 30.01.2008 um 21:36:

  [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?



Geschrieben von phlox81 am 30.01.2008 um 21:52:

 

AFAIK nein, da in den Spalten ja die Feldnamen sind.
Du könntest höchstens die Spielerspalte sortieren, und nach Tagen gruppieren.

phlox



Geschrieben von CDW am 10.02.2008 um 01:49:

 

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 Augenzwinkern

Edit: Huch, schau sich mal einer das Registrierungsdatum der ganzen alten Säcke in dem Thread an smile



Geschrieben von Misel am 10.02.2008 um 10:43:

 

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).



Geschrieben von CDW am 10.02.2008 um 12:38:

 

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).


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH