boban: vorgänge rund nachfolger ermitteln

id	! titel 	! sorting
23	! TITEL_5	!	7
54	! TITEL_1	!	2
34	! TITEL_2	!	4
23	! TITEL_3	!	5
54	! TITEL_4	!	6

Ich habe die ID und möchte die ID unter und überhalb dieser haben. Das Problem, die ID sind nicht geordnet, sondern die sortierung ist die Spalte SORTING


SELECT * FROM table 
WHERE id > 34
ORDER BY sorting ASC LIMIT 1

Mir würde es schon weiterhelfen, wenn ich nur den Nachfolger bzw. nur der Vorgänger rausbekommen würde

Boban

  1. Hallo boban,

    welche MYSQL oder MariaDB Version verwendest Du?

    Rolf

    --
    sumpsi - posui - obstruxi
  2. id	! titel 	! sorting
    23	! TITEL_5	!	7
    54	! TITEL_1	!	2
    34	! TITEL_2	!	4
    23	! TITEL_3	!	5
    54	! TITEL_4	!	6
    

    Ich habe die ID und möchte die ID unter und überhalb dieser haben.

    Du suchst dir die Sortierung der betreffenden Zeile und dann jeweils die Zeile, deren Sortierung gleich oder größer/kleiner ersterer Sortierung, aber nicht die gewünschte Zeile ist.

    Der ausdrückliche Ausschluss der betreffenden Zeile ist nötig, falls die Sortierung nicht eindeutig ist, es also mehrere Zeilen mit gleicher Sortierzahl gibt.

    Das Ganze kannst du zweimal machen, je einmal für die Zeile darüber und darunter, oder mit union in einem Rutsch:

    (select * from tabelle where sortierung <= (select sortierung from tabelle where id=34) and id != 34 order by sortierung limit 1) 
    union 
    (select * from tabelle where sortierung >= (select sortierung from tabelle where id=34) and id != 34 order by sortierung limit 1);
    
  3. Dein Beispiel ist falsch, die id 23 und 54 sind doppelt.

    ist sorting vorgegeben oder ermittelst du selbst?

    Die Lösung ist abhängig von der Anwendung. Wenn es um die Titel einer CD geht, ändert sich ja nichts, weder wird die Reihenfolge geändert noch wird ein Titel eingefügt oder entfernt.

    Wenn es um eine Aufgabe geht, bei der Titel öfter zu- oder weggefügt werden, gibst du jedem Datensatz die vorgaenger_id und nachfolger_id.

    Beim Einfügen mußt du dann die neue id als Nachfolger beim Vorgänger und als Vorgänger beim Nachfolger eintragen.

    vorgaenger_id | id | nachfolger_id
    
    (anfang)      | 34    | 23-s5
    34            | 23-s5 | 54-s6
    23-s5         | 54-s6 | 23-s7
    54-s6         | 23-s7 | (ende)
    

    Die neue id sei 55 und ist an zweiter Stelle einzufügen:

    vorgaenger_id | id | nachfolger_id
    
    (anfang)      | 34    | !23-s5! 55
    34            | 55    | 23-s5
    !34! 55       | 23-s5 | 54-s6
    23-s5         | 54-s6 | 23-s7
    54-s6         | 23-s7 | (ende)
    

    Das geht viel schneller, als bei jeder Änderung die Sortierfolge zu ermitteln und diese bei allen (nachfolgenden) Sätzen zu ändern.

    Und die gewünschten Vor- und Nachgänger kannst du beim gefundenen Datensatz direkt ablesen.

    Linuchs