Problem mit SQL-Statement
Problem mit SQL-Statement
am 28.10.2004 18:21:03 von Christian Ratsch
Hallo,
ich habe folgendes SQL-Statement (MySQL):
SELECT city1.name AS start,
city2.name AS wegpunkt,
city3.name AS ziel,
FROM fahrt,
city AS city1,
city AS city2,
city AS city3
WHERE fahrt.start = city1.id
AND fahrt.wegpunkt = city2.id
AND fahrt.ziel = city3.id
AND fahrt.id = 25
Ziel ist es, die Namen der Städte durch die Verknüpfung zweier Tabellen
im Klartext im SQL-Result zu haben (fahrt.start usw. zeigen auf IDs in
der Tabelle city). Das funktioniert wunderbar, solange start, wegpunkt
und ziel einen Wert haben. Es gibt aber auch den Fall, dass z.B.
wegpunkt nicht verwendet wird (also 0 ist). Dann liefert das Statement
aber ein komplett leeres Resultat. Ich möchte aber den Namen von start
und ziel trotzdem erfahren. Wie geht das?!? Ich beiße mir die Zähne dran
aus.
Habe schon versucht, die Zeile
AND fahrt.wegpunkt = city2.id
durch
AND (fahrt.wegpunkt = city2.id OR fahrt.wegpunkt = 0)
zu ersetzen. Aber dann bekomme ich ein langes Resultat mit jedem
möglichen Städtenamen für wegpunkt geliefert.
Also nochmal kurz:
Ich möchte als Resultat
"Hamburg, Hannover, Bielefeld" (funktioniert), oder aber auch
"Hamburg,,Bielefeld", wenn wegpunkt leer (0) ist (funktioniert nicht).
Danke für Eure Hilfe!
Christian
Re: Problem mit SQL-Statement
am 28.10.2004 20:14:36 von igor
schon mal versucht, deine WHERE klausel auf fahrt.id = 25 zu reduzieren?
"Christian Ratsch" schrieb im Newsbeitrag
news:2uckjqF28jvboU1@uni-berlin.de...
> Hallo,
>
> ich habe folgendes SQL-Statement (MySQL):
>
> SELECT city1.name AS start,
> city2.name AS wegpunkt,
> city3.name AS ziel,
> FROM fahrt,
> city AS city1,
> city AS city2,
> city AS city3
> WHERE fahrt.start = city1.id
> AND fahrt.wegpunkt = city2.id
> AND fahrt.ziel = city3.id
> AND fahrt.id = 25
>
> Ziel ist es, die Namen der Städte durch die Verknüpfung zweier Tabellen
> im Klartext im SQL-Result zu haben (fahrt.start usw. zeigen auf IDs in
> der Tabelle city). Das funktioniert wunderbar, solange start, wegpunkt
> und ziel einen Wert haben. Es gibt aber auch den Fall, dass z.B.
> wegpunkt nicht verwendet wird (also 0 ist). Dann liefert das Statement
> aber ein komplett leeres Resultat. Ich möchte aber den Namen von start
> und ziel trotzdem erfahren. Wie geht das?!? Ich beiße mir die Zähne dran
> aus.
>
> Habe schon versucht, die Zeile
> AND fahrt.wegpunkt = city2.id
> durch
> AND (fahrt.wegpunkt = city2.id OR fahrt.wegpunkt = 0)
> zu ersetzen. Aber dann bekomme ich ein langes Resultat mit jedem
> möglichen Städtenamen für wegpunkt geliefert.
>
> Also nochmal kurz:
> Ich möchte als Resultat
> "Hamburg, Hannover, Bielefeld" (funktioniert), oder aber auch
> "Hamburg,,Bielefeld", wenn wegpunkt leer (0) ist (funktioniert nicht).
>
> Danke für Eure Hilfe!
> Christian
Re: Problem mit SQL-Statement
am 28.10.2004 21:19:46 von Christian Ratsch
Igor schrieb:
> schon mal versucht, deine WHERE klausel auf fahrt.id = 25 zu reduzieren?
Macht aber keinen Sinn, weil das Resultat dann alle möglichen
Kombinationen von Städten beinhaltet. Bei 470 Städten sind das mal
gerade 103 Millionen :)
Nee, mein Ansatz ist schon richtig. Nur will ich eben, dass bei einer
"0" als start/wegpunkt/ziel trotzdem ein Ergebnis geliefert wird mit
einem leeren Städtenamen - anstatt gar keinem Ergebnis.
Christian
Re: Problem mit SQL-Statement
am 28.10.2004 21:53:54 von Kurt Stahl
On Thu, 28 Oct 2004 21:19:46 +0200, Christian Ratsch
wrote:
>Igor schrieb:
>> schon mal versucht, deine WHERE klausel auf fahrt.id = 25 zu reduzieren?
>
>Macht aber keinen Sinn, weil das Resultat dann alle möglichen
>Kombinationen von Städten beinhaltet. Bei 470 Städten sind das mal
>gerade 103 Millionen :)
>
>Nee, mein Ansatz ist schon richtig. Nur will ich eben, dass bei einer
>"0" als start/wegpunkt/ziel trotzdem ein Ergebnis geliefert wird mit
>einem leeren Städtenamen - anstatt gar keinem Ergebnis.
>
>
>Christian
Vielleicht so
AND fahrt.ziel like city3.id%
Gruss Kurt
Re: Problem mit SQL-Statement - Die Lösung
am 28.10.2004 23:41:11 von Christian Ratsch
Alles falsch... in d.c.d.mysql gab's die Lösung:
> Hallo,
>
> ich habe folgendes SQL-Statement (MySQL):
>
> SELECT city1.name AS start,
> city2.name AS wegpunkt,
> city3.name AS ziel,
> FROM fahrt,
> city AS city1,
> city AS city2,
> city AS city3
> WHERE fahrt.start = city1.id
> AND fahrt.wegpunkt = city2.id
> AND fahrt.ziel = city3.id
> AND fahrt.id = 25
>
> Ziel ist es, die Namen der Städte durch die Verknüpfung zweier
Tabellen im Klartext im SQL-Result zu haben (fahrt.start usw. zeigen auf
IDs in der Tabelle city). Das funktioniert wunderbar, solange start,
wegpunkt und ziel einen Wert haben. Es gibt aber auch den Fall, dass
z.B. wegpunkt nicht verwendet wird (also 0 ist). Dann liefert das
Statement aber ein komplett leeres Resultat. Ich möchte aber den Namen
von start und ziel trotzdem erfahren. Wie geht das?!? Ich beiße mir die
Zähne dran aus.
>
> Habe schon versucht, die Zeile
> AND fahrt.wegpunkt = city2.id
> durch
> AND (fahrt.wegpunkt = city2.id OR fahrt.wegpunkt = 0)
> zu ersetzen. Aber dann bekomme ich ein langes Resultat mit jedem
möglichen Städtenamen für wegpunkt geliefert.
Das hängt damit zusammen, dass du ein Kreuzprodukt bildest. Da
fahrt.wegpunkt immer 0 ist, wird diese "Dimension" nicht eingeschränkt,
also alle Städte zurückgegeben.
> Also nochmal kurz:
> Ich möchte als Resultat
> "Hamburg, Hannover, Bielefeld" (funktioniert), oder aber auch
> "Hamburg,,Bielefeld", wenn wegpunkt leer (0) ist (funktioniert nicht).
Wenn du das Krezuprodukt durch drei JOINs ersetzt, sollte es
funktionieren. Dann liefert city2.name NULL zurück. Die Interpretation
davon bleibt dann deiner Anwendung überlassen.
SELECT city1.name AS start, city2.name AS wegpunkt, city3.name AS ziel
FROM fahrt
LEFT JOIN city AS city1 ON city1.id=fahrt.start
LEFT JOIN city AS city2 ON city2.id=fahrt.wegpunkt
LEFT JOIN city AS city3 ON city3.id=fahrt.ziel
WHERE fahrt.id=25
Nebenbei: Warum benutzt du für einen leeren Wegpunkt den Wert 0 und
nicht NULL? Wenn du vorhast irgendwann auf (echte) referentielle
Integrität umzusteigen, sind dir 0-Werte ziemlich lästig im Weg.
Außerdem sieht es sauberer aus, wenn ein leerer Wert auch als solcher in
der DB steht.