Linuchs: SELECT IN () mit definierter Reihenfolge

Hallo,

in einem Cookie stehen mehrere IDs von Orten. Beim Anklicken eines Ortes wird dessen ID den bereits vorhandenen vorangestellt und allesamt als Cookie wieder gespeichert.

Beispiel 4711,21,365

Nun lese ich das Cookie wieder, dazu die Orte aus der Datenbank und möchte den aktuellsten Ort (4711) zuerst haben.

WHERE id in ( 4711,21,365 )

liefert aber nicht die gewünschte Folge. Wie geht das mit SQL?

Linuchs

  1. In SQL gibt es ein ORDER BY, damit kann man sortieren.

    Gruß
    streikender
    T-Rex

  2. Tach!

    Beispiel 4711,21,365
    Nun lese ich das Cookie wieder, dazu die Orte aus der Datenbank und möchte den aktuellsten Ort (4711) zuerst haben.
    WHERE id in ( 4711,21,365 )
    liefert aber nicht die gewünschte Folge. Wie geht das mit SQL?

    Die Where-Klausel interessiert sich nicht für eine Reihenfolge der Datensätze. Sie sorgt nur dafür, dass die Datensätze überhaupt selektiert werden. Dazu kann ein Index verwendet werden oder ein Full-Table-Scan. In einem Index liegen die Daten sortiert vor, beim FTS nicht. Es ist also undefiniert, wie die Daten in die Ergebnismenge kommen. Sortieren geht über ORDER BY, und da brauchst du nun eine Funktion, die einen sortierfähigen Wert gemäß der von angegebenen Reihenfolge liefert. MySQL/MariaDB kennt die beiden Funktionen FIELD() und FIND_IN_SET(). Ich habs jetzt nicht probiert, aber die Beschreibung im Handbuch sieht so aus, als ob sie zielführend sind.

    dedlfix.

    1. MySQL/MariaDB kennt die beiden Funktionen FIELD() und FIND_IN_SET(). Ich habs jetzt nicht probiert, aber die Beschreibung im Handbuch sieht so aus, als ob sie zielführend sind.

      Danke für den Tipp. Habe ich mir angeschaut, passt nicht.

      Meine Lösung:

      Anstatt WHERE irgendwas IN ( 4711,21,365 )
      mache ich 3 einzelne SELECT und verbinde die mit UNION.

      Ist irgendwie wie EDV zu Fuß.

      Linuchs

      1. MySQL/MariaDB kennt die beiden Funktionen FIELD() und FIND_IN_SET(). Ich habs jetzt nicht probiert, aber die Beschreibung im Handbuch sieht so aus, als ob sie zielführend sind.

        Danke für den Tipp. Habe ich mir angeschaut, passt nicht.

        SELECT *, FIELD(feldname, 8, 5, 4711) AS meinsort FROM tabelle order by meinsort

        1. Tach!

          SELECT *, FIELD(feldname, 8, 5, 4711) AS meinsort FROM tabelle order by meinsort

          An sowas dachte ich, wobei das FIELD(...) gleich als ORDER-BY-Kriterium verwendet werden kann, ohne eine Spalte in der Ergebnismenge zu bilden.

          dedlfix.