dedlfix: SELECT Bahnhöfe auf einer Strecke

Beitrag lesen

Tach!

ich habe eine Bahnlinie angelegt und die ID der Bahnhöfe (treffpunkte) in einem Textfeld mit Komma getrennt.

Soweit so schlecht.

#ON          trp1.id IN ( lin1.treffpunkt_ids )
ON          trp1.id IN ( 1171,1170 )

Die hier mit # ausgeblendete Version bringt nur einen Treffer, obwohl zwei Einträge im Feld lin1.treffpunkt_ids vorhanden sind.

In dem Feld ist ein String. Ein String sind keine zwei Werte, egal wie er aussieht. Der IN()-Operator möchte die Wert direkt haben. Er klamüsert sich die nicht aus einen String heraus.

Dass du überhaupt einen Treffer bekommst, liegt an der automatischen Typumwandlung, weil trp1.id eine Zahl ist und damit die Typumwandlung in Richtung Zahl veranlasst. Bei "1171,1170" sieht der erste Teil bis zum Komma wie eine Zahl aus. Somit löst sich sinngemäß

SELECT 1171 IN ("1171,1170")

zu

SELECT 1171 IN (1171)

auf und ergibt 1 (=true). Gegenproben:

SELECT "1171" IN ("1171,1170")
SELECT 1170 IN ("1171,1170")

Das ergibt zum einen 0 (=false), weil die Strings direkt verglichen werden, und zum anderen ebenfalls 0, weil die Typumwandlung 1171 ergibt und das nicht gleich 1170 ist.

Du kannst zwar FIND_IN_SET() nehmen, aber das bleibt keine gescheite Lösung. Ein RDBMS ist auf Datenmengen optimiert, nicht auf Stringverarbeitung. Für letztere kann es keine Optimierungen verwenden und muss immer den kompletten Datenbestand durchlaufen.

Die dann zwecks Test eingesetzten Treffpunkte bringen zwar zwei Treffer, aber nicht in der richtigen Reihenfolge.

Reihenfolge erhält man mit ORDER BY (und unter Umständen auch mit GROUP BY). Alle anderen Mengen sind per Definition unsortiert.

dedlfix.