Spezielle SQL Abfrage mit Gruppierung!
Dodo
- datenbank
0 Frank (no reg)0 Dodo
Hey, ich hoffe hier kann mir jemand helfen. In anderen Foren konnte das leider keiner, bzw. haben nicht wirklich mein Problem verstanden.
Ich habe eine Tabelle mit Events drin, diese sind Gruppiert, also jede Gruppe kann beliebig viele Einträge haben.
In meinem Query möchte ich jetzt das jeweils nächste Event von allen Gruppen ausgeben.
Mit SELECT * FROM events
WHERE date\_start
>= '$current_timestamp' ORDER BY date\_start
Wird mir folgendes ausgegeben:
http://img214.imageshack.us/img214/677/sqldd7.jpg
Die rot umrandeten Einträge sollten aber nur ausgegeben werden, leider funktioniert hierbei GROUP BY nicht.
Wenn ich mein Query so umstelle
SELECT * FROM events
WHERE date\_start
>= '$current_timestamp' GROUP BY group
ORDER BY date\_start
wird zwar jeweils nur ein Event einer Gruppe ausgegeben, aber nicht das nächste, sondern irgendeins, weis nicht nach welcher Sortierung das ausgewählt wird.
Im Grunde möchte ich aktuell dieses ausgegeben bekommen:
http://img107.imageshack.us/img107/2693/sql1jm6.jpg
Hat jemand eine Ahnung wie der Query aussehen muss, das mir eben nur ein Event pro Gruppe ausgegebn wird und das abhängig vom aktuellen Datum?
MfG Dodo
Hi,
ich würde sagen, du brauchst sicherlich einen Join zwischen Gruppen und ihren Terminen und dann eine korrelierende Unterabfrage (auf die Gruppe) in der WHERE Klausel.
Die korrelierende Abfrage in der WHERE Klausel muss dann auch den 1. Datensatz pro Gruppe selektieren, dessen date_start grösser ist als das aktuelle Datum.
Da du aber nicht angegeben hast, mit welcher Datenbank (und in welcher Version) du arbeitest, ist es schwer zu sagen, ob es bei dir funktioniert.
Ciao, Frank
Hi,
ich würde sagen, du brauchst sicherlich einen Join zwischen Gruppen und ihren Terminen und dann eine korrelierende Unterabfrage (auf die Gruppe) in der WHERE Klausel.
Ein JOIN ist doch nur notwendig wenn ich 2 Tabellen mit einander verknüpfen möchte!
Es gibt aber keine extra Tabelle für die Gruppen, sondern es ist eine Spalte in der Tabelle in die immer der entsprechende String eingetragen wird. Alle Datensätze die hier den gleichen String haben sind eine Gruppe.
Da du aber nicht angegeben hast, mit welcher Datenbank (und in welcher Version) du arbeitest, ist es schwer zu sagen, ob es bei dir funktioniert.
Ciao, Frank
Ich nutze mySQL
MySQL-Client-Version: 5.0.51
Hallo,
Ein JOIN ist doch nur notwendig wenn ich 2 Tabellen mit einander verknüpfen möchte!
a) mit JOINs kann man auch auf sich selbst verknüpfen ... macht recht häufig auch einen gewissen Sinn
Es gibt aber keine extra Tabelle für die Gruppen, sondern es ist eine Spalte in der Tabelle in die immer der entsprechende String eingetragen wird.
b) ich bin davon ausgegangen, dass du ein halbwegs normalisiertes Datenmodell hast (Gruppen und Termine) - leider eine Fehlannahme. Aber vielleicht solltest du dem Thema Normalisierung ein Quentchen Aufmerksamkeit schenken?
c) verwende a)
Pro Gruppe solltest du den nächsten Termin wie folgt bekommen ...
>= '$current_timestamp'
SELECT Gruppe...
GROUP BY Gruppe
SELECT Gruppe, MIN(date_start) AS erstesdatum ....
Im Schritt 2 suchst du mithilfe eines JOINS alle Datensätze raus, die in Gruppe und date_start mit der obigen Ergebnismenge übereinstimmen
Probiers mal .. das war jetzt mal so aus dem Hut gezogen ...
Ansonsten, genereller Rat: Zerlege dein GROSSES PROBLEM in kleine probleme, die du einfach einzeln einfacher lösen kannst.
Ciao, Frank