BlackBoard » Design, Programmierung & Entwicklung » Programmieren » [SQL] Abfrage nach mehreren Kriterien gruppieren » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen [SQL] Abfrage nach mehreren Kriterien gruppieren
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Misel Misel ist männlich
Hüter des Kitkat


images/avatars/avatar-2084.png

Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d e

[SQL] Abfrage nach mehreren Kriterien gruppieren       Zum Anfang der Seite springen

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 Misel ist offline E-Mail an Misel senden Homepage von Misel Beiträge von Misel suchen
phlox81 phlox81 ist männlich
Bote des Lichts und Moderator


images/avatars/avatar-2264.jpg

Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo

      Zum Anfang der Seite springen

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 phlox81 ist offline E-Mail an phlox81 senden Homepage von phlox81 Beiträge von phlox81 suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

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

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von CDW: 10.02.2008 01:50.

10.02.2008 01:49 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Misel Misel ist männlich
Hüter des Kitkat


images/avatars/avatar-2084.png

Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d e

Themenstarter Thema begonnen von Misel
      Zum Anfang der Seite springen

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 Misel ist offline E-Mail an Misel senden Homepage von Misel Beiträge von Misel suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

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 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » [SQL] Abfrage nach mehreren Kriterien gruppieren

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH