verschachtele Abfrage

seerose

Benutzer
Beiträge
5
Ich habe einen Termin Planer über Mysql/Php programmiert.

In eine Übersicht werden alle Termine angezeigt

Tabellenstruktur:
id #Schlüssel
end # wenn Termin gelaufen = 1, wird dann in der Übesicht nicht mehr angezeigt
Serie
sub_id
timestamp # daraus gewinne ich z.B. 6.12.2014 20:15

Das Problem, es gibt auch Serien-Termine, die bestehen aus einen Haupt Eintrag Serie=1
und viele Untereinträge die über Sub_id=id verknüpt werden.

Ist nun der Haupttermin gelaufen, bekommt der end=1 und fliegt aus der Übersicht raus.
Dafür sollte eigentlich der nächste Untertermin angezeigt werden.
Hier fängt das Problem an.

SELECT * FROM jobs WHERE END =0 ORDER BY von_timestamp
musst heißen
SELECT * FROM jobs WHERE END =0 wenn (serie=1 and end=1) dann SELECT * FROM jobs WHERE sub_id=id ORDER BY von_timestamp

also ist es eine Serie, wo der Haupttermin gelaufen ist, zeige mit den ersten Untertermin.

Ich habe das zwar schon über php mit viel drehen gelöst, indem ich im select OR serie=1 ergänz habe,
dann in der Liste die serie=1 and end=1 abgefangen habe und den 1. Untertermin dafür gezeigt.
leider stimmt dann die Sortierung nicht, weil vom Haupteintrag ausgegangen wird.

Kann man das überhaupt über einen Sql-Select löschen?
 
Werbung:
Wenn ich Dich richtig verstehe hast Du eine rekursive Struktur, die Du abfragen willst, oder?

rekursive???

Meine Liste soll so aussehen:
1.4.2015 Kundenbesuch # normaler Termin
+2.4.2015 Wartung für Kunde A DSL # dieser Termin hat 2 Untertermine
3.4.2015 Wartung für Kunde A Server #wird erst angezeigt, wenn der 2.4.2015 gelaufen ist
4.4.2015 Wartung für Kunde A PC #wird erst angezeigt, wenn der 3.4.2015 gelaufen ist
 
Zuletzt bearbeitet von einem Moderator:
Ja, rekursiv. Also eine Datenmenge die von einer anderen Teilmenge abhängig ist.

Da die Rekursionstiefe in deinem Fall anscheinend nur eine Iteration benötigt könnte man das Problem auch mit einem JOIN lösen. Die Ergebnismenge müsste dann allerdings trotzdem in PHP relativ umständlich zerpflückt werden.
 
(
SELECT * FROM jobs
WHERE END =0AND sub_id =0
)
UNION (
SELECT * FROM `jobs`
WHERE END =0AND sub_id >0
GROUP BY sub_id
)
ORDER BY von_timestamp

Ich hoffe hier ist keinen Denkfehler, aber so schwer war es nicht!

im ersten Teil werden alle Termine geholt , im zweiten alle Untertermine geholt, durch group nur 1
Nur noch ein kleines Problem, läuft der Haupttermin noch, wird auch sein Untertermin angezeigt, das lässt sich aber Easy über PHP biegen.

Aber ich glaube, das lässt sich auch über mysql selekten.
also im 2.Teil (holt ja alle untertermine)
SELECT id FROM jobs
WHERE END =0 AND sub_id >0 and
sub_id=
(SELECT sub_id FROM jobs WHERE END =0 and sub_id=id GROUP BY sub_id )

also zeige mir den Untertermin nur dann, wenn sein Haupttermin gelaufen ist also end=1
hier steck noch der Fehler im Detail, vielleicht musst man auch mit count arbeiten,
meine Augen fallen langsam zu, vielleicht ist noch jemand wach.

Gute Lektüre ist:
http://www.heise.de/ix/artikel/Ein-Join-ist-nicht-genug-506380.html
http://de.wikibooks.org/wiki/Einführung_in_SQL:_Unterabfragen
der 2. Link ist eher rein SQL
 
Ich hoffe hier ist keinen Denkfehler, aber so schwer war es nicht!
Ja, das funktioniert derzeit relativ exklusiv in MySQL. Nach dem Standard ist deine Nutzung von GROUP BY falsch und sollte eine Fehlermeldung geben. Davon abgesehen besteht die Möglichkeit, dass du falsche Daten bekommst.

Das ist in dieser Abfrage überflüssig, da schon durch das Subquery sichergestellt wird, dass sub_id nicht 0 ist.

(SELECT sub_id FROM jobs WHERE END =0 and sub_id=id GROUP BY sub_id )
Das Ergebnis dieser Subanfrage wird immer der Wert von id oder eine leere Menge sein.
 
SELECT * FROM jobs WHERE end=0 and sub_id=0 )
UNION
(
SELECT * FROM jobs AS j1
WHERE END =0 AND sub_id >0 and
0=
(SELECT count(id) from jobs where id=j1.sub_id and end=0 )
group by sub_id
ORDER BY von_timestamp
)
ORDER BY von_timestamp

Weil alle meinten, das ginge nicht über reinen Mysql habe ich nicht aufgegeben.
Die Liste wird nun genau so angezeigt, wie es sollte.

Im 1. Abschnitte werden alle normalen Termine geholt,
im 2 Abschnitt alle Untertermine, aber nur dann wenn sein Hauptermin schon
gelaufen ist also end=0
dafür ist dies zuständig:
0=
(SELECT count(id) from jobs where id=j1.sub_id and end=0 )



@Admin: hier fehlt eine Code Formatierng
 
Weil alle meinten, das ginge nicht über reinen Mysql habe ich nicht aufgegeben.

Das nenne ich sportlich ;-)

Code bekommst Du hier via spezieller Tags hin, das steht auch in der Hilfe dokumentiert. Glaub kaum, daß jetzt jemand hinter Dir herläuft und das fixt ;-)


Davon abgesehen: MySQL kann sehr, sehr viele Dinge NICHT, die woanders funktionieren.
 
Ist ja schön das es funktioniert... Wenn ich dir dann aber den 3 Zeiler zeige den man in richtigen Datenbanken dafür braucht...
Und dazu dann evtl. noch ein paar Performance-Auswertungen...

Aber hey... Wenigstens ist das heutige Problem beseitigt, wen interessiert den schon morgen ? ;)
 
LECT * FROM jobs WHERE end=0 and sub_id=0 )
Ist ja schön das es funktioniert... Wenn ich dir dann aber den 3 Zeiler zeige den man in richtigen Datenbanken dafür braucht...
Und dazu dann evtl. noch ein paar Performance-Auswertungen...

Das ist der 1. Schlief, falls Du das in 3 Zeilen codiert, zeigt mal,
mit einer richtigen Datenbanken meins Du bestimmt <>Mysql
So schlecht ist Mysql 5.6 auch wieder nicht!
 
Ich möchte noch anmerken das du deine Spalte end vieleicht anders nennen solltest oder zumindest in [] setzen solltest, oder was auch immer MySQL verwendet um Schlüsselwörter als Spaltennamen kenntlich zu machen.
 
Werbung:
Zurück
Oben