Saugkraft
Aktives Mitglied
Thread Starter
- Dabei seit
- 20.02.2005
- Beiträge
- 8.998
- Reaktionspunkte
- 3.190
Hallo SQL Experten,
ich sitze grad an einem relativ kniffligen Problem und ich weiß nicht, ob es dazu eine reine SQL Lösung gibt. Ich habe eine Abfrage bei der datensatz_id, status1, status2 und datum abgefragt werden sollen.
datensatz_id und status1 kommen aus Tabelle 1.
datensatz_id ist Fremdschlüssel in Tabelle 2. Aus Tabelle 2 lese ich status2 und datum aus.
status1 kann true sein, status2 kann true sein oder alle beide.
In Tabelle 2 sind jeder datensatz_id aus Tabelle 1 mehrere Datumswerte zugeordnet.
Ich will abfragen, an welchen Tagen (Datum) status1, status2 oder alle beide true sind. Dabei soll nach Datumswerten sortiert werden.
Soweit so gut. Problem: Ich will jede datensatz_id nur einmal aufgeführt bekommen.
Mit
spuckt er mir die Datensätze aus, führt aber ggf. die datensatz_id doppelt auf. Nämlich dort wo ein status true ist und mehrere Datumseinträge zu einer datensatz_id existieren.
Zum Beispiel so:
Was ich brauche ist das jeweils erste Datum bei dem eine datensatz_id auftaucht. Bei 2 z.B. der 1.1.2008. Danach ist die datensatz_id "verbraucht" und darf nicht wieder auftauchen. Das Ergebnis sollte also so aussehen:
Warum das so sein muss? Da hängen natürlich noch ein paar andere Daten aus anderen Tabellen dran. Wenn ich daraus eine Webseite generiere, kommen die Daten geclustert zum Einsatz und zu jeder id werden die Datumswerte nochmal gesondert abgefragt (plus ein paar Zusatzinfos):
Beginn: 1.1.2008
id: 2
Termine: 1.1.2008, 2.1.2008, 8.1.2008
Entscheidend für die Sortierung ist aber der erste Termin. Wenn die id mehrfach (irgendwo weiter hinten in der Liste nochmal) auftaucht, haut er mir dazu natürlich nochmal die 4 Termine raus. Das will ich natürlich nicht.
Ich kann an der Datenbank Struktur nichts ändern. Dazu hängt zuviel hinten dran. Die Frage ist also: Gibt es dafür eine reine SQL Lösung oder muss ich in ASP, PHP, etc. was programmieren um bereits abgearbeitete ids zu überspringen?
Ich hoffe, ihr könnt mir helfen.
ich sitze grad an einem relativ kniffligen Problem und ich weiß nicht, ob es dazu eine reine SQL Lösung gibt. Ich habe eine Abfrage bei der datensatz_id, status1, status2 und datum abgefragt werden sollen.
datensatz_id und status1 kommen aus Tabelle 1.
datensatz_id ist Fremdschlüssel in Tabelle 2. Aus Tabelle 2 lese ich status2 und datum aus.
status1 kann true sein, status2 kann true sein oder alle beide.
In Tabelle 2 sind jeder datensatz_id aus Tabelle 1 mehrere Datumswerte zugeordnet.
Ich will abfragen, an welchen Tagen (Datum) status1, status2 oder alle beide true sind. Dabei soll nach Datumswerten sortiert werden.
Soweit so gut. Problem: Ich will jede datensatz_id nur einmal aufgeführt bekommen.
Mit
Code:
SELECT tabelle1.datensatz_id, tabelle1.status1, tabelle2.status2, tabelle2.datum INNER JOIN tabelle1 ON tabelle1.datensatz_id = tabelle2.datensatz_id WHERE tabelle1.status1 = true OR tabelle2.status2 = true GROUP BY tabelle1.datensatz_id, tabelle1.status1, tabelle2.status2, tabelle2.datum ORDER BY MIN(tabelle2.datum)
Zum Beispiel so:
Code:
datensatz_id status1 status2 datum
2 true false 1.1.2008
2 true false 2.1.2008
3 true true 5.1.2008
3 true true 7.1.2008
2 false true 8.1.2008
1 true true 9.1.2008
Was ich brauche ist das jeweils erste Datum bei dem eine datensatz_id auftaucht. Bei 2 z.B. der 1.1.2008. Danach ist die datensatz_id "verbraucht" und darf nicht wieder auftauchen. Das Ergebnis sollte also so aussehen:
Code:
datensatz_id status1 status2 datum
2 true false 1.1.2008
3 true true 5.1.2008
1 true true 9.1.2008
Warum das so sein muss? Da hängen natürlich noch ein paar andere Daten aus anderen Tabellen dran. Wenn ich daraus eine Webseite generiere, kommen die Daten geclustert zum Einsatz und zu jeder id werden die Datumswerte nochmal gesondert abgefragt (plus ein paar Zusatzinfos):
Beginn: 1.1.2008
id: 2
Termine: 1.1.2008, 2.1.2008, 8.1.2008
Entscheidend für die Sortierung ist aber der erste Termin. Wenn die id mehrfach (irgendwo weiter hinten in der Liste nochmal) auftaucht, haut er mir dazu natürlich nochmal die 4 Termine raus. Das will ich natürlich nicht.
Ich kann an der Datenbank Struktur nichts ändern. Dazu hängt zuviel hinten dran. Die Frage ist also: Gibt es dafür eine reine SQL Lösung oder muss ich in ASP, PHP, etc. was programmieren um bereits abgearbeitete ids zu überspringen?
Ich hoffe, ihr könnt mir helfen.