Bedingte Abfrage?
Peter Thomassen
- datenbank
Hallo,
ich benötige eine Abfrage im Stil von:
SELECT cycle FROM contract WHERE id = $id wenn parent_id IS NULL, andernfalls
SELECT cycle FROM contract WHERE id = (SELECT parent_id FROM contract WHERE id = $id)
Es soll also nach Datensätzen mit id = $id gesucht werden, falls parent_id leer ist, andernfalls soll nach Datensätzen mit id = (SELECT ...) gesucht werden.
Geht das, oder muss ich erst die erste Abfrage ausführen, das Ergebnis prüfen und abhängig davon die zweite ausführen (oder auch nicht)?
Danke!
Peter
Hallo Peter!
SELECT cycle FROM contract WHERE id = $id wenn parent_id IS NULL, andernfalls
SELECT cycle FROM contract WHERE id = (SELECT parent_id FROM contract WHERE id = $id)
Geht das, oder muss ich erst die erste Abfrage ausführen, das Ergebnis prüfen und abhängig davon die zweite ausführen (oder auch nicht)?
Ich bin mir relativ sicher, daß es in SQL irgendwie geht, aber sicher weiß ich es nicht, da müßte ich erst irgendwo nachlesen.
Wichtig in dem zusammenhang ist auch, welche Datenbank Du denn einsetzt. Denn je nachdem, was du einsetzt kan nes sein, daß Du das mit einer Abfrage machen kannst, oder eben auch ,daß es nicht geht, je nachdem was Dein DBMS unterstützt.
Am einfachsten ist es wohl, wenn Du 2 separate Anfragen stellst, also erst die erste, und wenn die nichts ergibt die zweite. Aber schau einfach mal in der Dokumentation der von Dir verwendeten Datenbank nach ;)
MfG
Götz
Hallo Götz!
Am einfachsten ist es wohl, wenn Du 2 separate Anfragen stellst, also erst die erste, und wenn die nichts ergibt die zweite.
Das wollte ich zwecks Codekürzung und -beschleunigung vermeiden :-)
Aber schau einfach mal in der Dokumentation der von Dir verwendeten Datenbank nach ;)
Ich verwende MySQL 4.1.3, das ist die neueste Betaversion mit Subselects etc. ... Ich werd mal gucken.
Bye,
Peter
Hello,
Ich hatte sowas hier neulich schon mal beantwortet. Das ganze nennt sich "self join" oder Selbstbezug. Man öffnet die Tabelle dazu zweimal in zwei verschiedenen Arbeitsbereichen, also unter verschiedenen Aliasen. Das funktioniert auch schon mit Mysql 3.23.x
Ich probier mal, ob ichs so zusammen bekomme
Deine Aufgabe:
SELECT cycle FROM contract WHERE id = $id wenn parent_id IS NULL, andernfalls
SELECT cycle FROM contract WHERE id = (SELECT parent_id FROM contract WHERE id = $id)
Es soll also nach Datensätzen mit id = $id gesucht werden, falls parent_id leer ist, andernfalls soll nach Datensätzen mit id = (SELECT ...) gesucht werden.
Select a.cycle, b.cycle from contract a, contract b where (a.id = $id and a.parent_id is NULL)
or (a.id = $id and a.parent_id is not null and b.id = a.parent_id);
Hier vorne könnte man dann noch ein if(a.parent_id is null, a.cycle, b.cycle) as CYCLE spendieren, um entweder nur a.cycle oder nur b.cycle zu haben.
Probier mal, was da rauskommt. Ich habe gerade keine geeignete Tabelle. Die muss ich erst basteln.
Ist ne spannende Sache das. Wenn wir es zusmman hinbekommen, kann ich mein CMS umbauen.
Welche Sortierung muss das ganze denn haben?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo,
Welche Sortierung muss das ganze denn haben?
Keine, da das Ergebnis immer nur aus einem Datensatz besteht.
Bye,
Peter
Hello,
Welche Sortierung muss das ganze denn haben?
Keine, da das Ergebnis immer nur aus einem Datensatz besteht.
Genau das hatte mich irritiert (s.o.). Aber Du wolltest das ja so haben *g*
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello Peter,
bist Du sicher, dass Deine Aufgabenstellung so richtig ist?
Ich glaube, da ist was falsch, oder?
Wie muss die Eltern-Kind-Beziehung des gewünschten Ergebisses aussehen?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo
bist Du sicher, dass Deine Aufgabenstellung so richtig ist?
Ich glaube, da ist was falsch, oder?Wie muss die Eltern-Kind-Beziehung des gewünschten Ergebisses aussehen?
Man kann Verträge schachteln, z.B. Domainvertrag 2 innerhalb von Hostinvertrag 1. parent_id von 2 ist also 1.
Wenn parent_id leer ist, möchte ich den Abrechnungszeitraum des Vertrages haben. Wenn wir es aber mit einem Untervertrag zu tun haben (parent_id IS NOT NULL), möchte ich den Abrechungszeitraum des Hauptvertrages haben.
Ist da was falsch?
Bye,
Peter
Hello,
bist Du sicher, dass Deine Aufgabenstellung so richtig ist?
Ich glaube, da ist was falsch, oder?Wie muss die Eltern-Kind-Beziehung des gewünschten Ergebisses aussehen?
Man kann Verträge schachteln, z.B. Domainvertrag 2 innerhalb von Hostinvertrag 1. parent_id von 2 ist also 1.
Wenn parent_id leer ist, möchte ich den Abrechnungszeitraum des Vertrages haben. Wenn wir es aber mit einem Untervertrag zu tun haben (parent_id IS NOT NULL), möchte ich den Abrechungszeitraum des Hauptvertrages haben.
Nein, ganeu das hatte ich ja herausbekommen, dass immer nur eine Antwort kam und war mir nicht sicher, ob Du das haben wolltest.
Ich habe nämlich noch eine zweite Variante, bei der man immer den Parent bekommt, wenn es einer ist, oder das angesprochene Child nebst Parent. Oder in der dritten Variante bekommt man immer den Parent nund alle seine Kinder.
Ich
Harzliche Grüße aus http://www.annerschbarrich.de
Tom