Sql Min() Max()

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sql Min() Max()

    hallo leute,

    ich hab heut morgen nen kleinen hänger und komm nicht weiter.
    generell wollte ich aus zwei abfragen eine machen. in der tabelle hab ich eine eindeutige id. über die id wird mein datensatz angezeigt. nun möchte ich oben zwei links einbinden um jeweils einen datensatz vor oder zurück zu gehen. durch löschen, anlegen kopieren können die id's aber lückenhaft werden.

    folgende abfragen sind im script:
    gibt das maximum kleiner als 22 aus
    PHP-Code:
    SELECT MAXid ) AS prev
    FROM numbers
    WHERE id 
    '22' 
    gibt das minimum grösser als 22 aus
    PHP-Code:
    SELECT MINid ) AS next
    FROM numbers
    WHERE id 
    '22' 
    Da ich aber mein script etwas übersichtlicher gestallten wollte, möchte ich das ganze aber in einer abfrage lösen, d.h ich gebe in der where bedingung meinen aktuellen datensatz an und will nun genau die nächst höhere oder niedriegere angezeigt bekommen.

    dies brachte auch nicht die lösung, da es nur klappt, wenn es eine id gibt die höher ist und eine die niedriger ist.
    PHP-Code:
    SELECT MAXt1.id ) AS prev
           
    MINt2.id ) AS next
    FROM numbers 
    AS t1numbers AS t2
    WHERE t1
    .id '22' AND t2.id '22' 
    Mit IF klappt es leider auch nur wenn die aktuelle id nicht am anfang oder am ende liegt.
    PHP-Code:
    SELECT IF ( MAXt1.id ) = '22'NULLMAXt1.id ) ) AS prev
           IF ( 
    MINt2.id ) = '22'NULLMINt2.id ) ) AS next
    FROM numbers 
    AS t1numbers AS t2
    WHERE t1
    .id '22' AND t2.id '22' 
    es liegt wohl noch an der AND bedingung ?

    eigentlich sollte es so sein, dass ich die aktuelle id angebe, wenn eine niedriegere vorhanden, prev = niedriegere id sonst prev = NULL, wenn eine höhere vorhanden, next = höhere id sonst next = null.

    Über jede Hilfe / Gedankengang wäre ich dankbar.

    GruZZ GriZZ

  • #2
    Den kleineren Wert herausfinden :

    select id from t1 where id < 2 order by id asc LIMIT1

    wenn es kein kleiner 2 gibt, dann gibt es keinen wert


    Den nächsten wert herausfinden:

    SELECT id
    FROM t1
    WHERE id >2
    ORDER BY id ASC
    LIMIT 1

    Du kannst die beiden in einem JOIN verbinden, gibt es gar keiner Lösung, ist weder ein kleinerer noch ein grösserer Datenstz vorhanden, ist t1.id NULL so gibt es keine kleineren Datensätze und ist t2.id NULL so gibt es keine grösseren Datensätze

    Ich denke der Inner Join is der richtige, aber da man ja LIMIT 1 benutzt dürfte es auch keine Performance-probleme geben.


    MIN und MAX sind ja Aggregatfunktionen und meiner Meinung nach in diesem Kontext nicht zu gebrauchen.


    An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

    Kommentar


    • #3
      Hi Max auch noch wach ?

      Ich habs irgendwie noch nicht ganz gepeilt, zwar schon was Du meinst, aber ... geh wohl gleich mal pennen.

      Ansatz:
      SELECT id
      FROM numbers
      WHERE id < 22
      ORDER BY id ASC LIMIT 1

      SELECT id
      FROM numbers
      WHERE id > 22
      ORDER BY id ASC LIMIT 1

      Daraus wird dann das :
      SELECT t1.id, t2.id
      FROM numbers AS t1
      INNER JOIN numbers AS t2
      WHERE t1.id < 24
      AND t2.id > 24
      ORDER BY t1.id ASC LIMIT 1

      Aber ich seh schon im Ansatz das da nicht das gewünschte rauskommt und kommt es auch nicht. Es funktioniert nur wenn es einen kleineren und grösseren wert gibt.



      GruZZ GriZZ

      THX nochmal !

      Kommentar


      • #4
        OffTopic:
        Nein, nicht noch wach, sondern schon wach


        An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

        Kommentar

        Lädt...
        X