AllesMeins: /MYSQL: 11 Einträge um einen Wert herum

Hiho,

ich habe eine Tabelle in der sich mehrere einträge mit jeweils einer Punktzahl befinden. Nun möchte ich eine Liste mit 11 Einträgen ausgeben, bei der sich diese Einträge wo möglich um den gesuchten Wert herum bewegen. Also die 5 Punktzahlen, die besser sind als der gewählte Wert, der Wert selber und die 5 die schlechter sind.
Wenn sich der Wert unter den ersten oder unter den letzten Plätzen ist sollen aber trotzdem 11 Werte angezeigt werden. Sprich wenn der gesuchte Wert Platz 1 ist soll halt der erste und die 10 nachfolgenden gezeigt werden. Ist das irgendwie rein mit mySQL zu leisten oder muss ich die ganze Tabelle lesen und dann mit PHP die entsprechenden einträge rausuchen und ausgeben?

Grüsse

Marc

  1. select * from tabelle
    order by abs(spalte-wert) asc
    limit 11

    1. Hiho,

      hmm, das tut es irgendwie nicht. Habe gerade mal damit etwas rumexperimentiert. Das sind zwei Test-querys:

      select punkte from user order by abs(punkte-14) asc limit 5

      Ergebniss:

      Array ( [0] => 14 )
      Array ( [0] => 10 )
      Array ( [0] => 5 )
      Array ( [0] => 0 )
      Array ( [0] => 0 )

      select punkte from user order by abs(punkte-10) asc limit 5

      Array ( [0] => 10 )
      Array ( [0] => 14 )
      Array ( [0] => 5 )
      Array ( [0] => 0 )
      Array ( [0] => 0 )

      select punkte from user order by abs(punkte-271) asc limit 5
      Array ( [0] => 271 )
      Array ( [0] => 340 )
      Array ( [0] => 121 )
      Array ( [0] => 435 )
      Array ( [0] => 14 )

      Wie du siehst wird immer der gesuchte Wert ganz nach oben gezogen und der Rest ist auch nicht wirklich sortiert...

      1. ich habe das schon zig-mal benutzt und es hat immer funktioniert.

        allerdings bekomme ich als antwort von sql-server nicht:

        Array ( [0] => 10 )
        Array ( [0] => 14 )
        Array ( [0] => 5 )
        Array ( [0] => 0 )
        Array ( [0] => 0 )

        sondern ein result-set.

        vielleicht tippst du mal direkt

        select punkte from user order by abs(punkte-14) asc limit 5

        in den sql-server ein.

        1. Hiho,

          ich hatte das ganze gleich in ein PHP script eingebettet, das danach einfach nur ein

          while($in = mysql_fetch_row($result)){
          print_r($in);
          }

          enthielt. Bin gerade nicht daheim, deswegen kann ich es nicht direkt am Server ausprobieren. Wie dem auch sei, alleine von der Logik her kann deines nicht funktionieren. Erst einmal gibt abs() immer eine Zahl grösser 0 heraus (es sei denn der Wert steht genauso in der Datenbank (das erklärt wieso der erste Wert immer der gesuchte ist). Und dann gibt abs() auch nicht die 5 drumherumliegenden aus, sondern die 5 bei denen die Punkte am dichtesten zusammen sind. Sprich wenn ich in der DB

          1
          2
          3
          4
          5
          100
          200
          300
          400
          500

          stehen habe und als Wert 5 nehme, dann wird 5,4,3,2,1 ausgegeben. Halt nach dem Betrag der differenz sortiert.

          Grüsse

          Marc

          1. wie dem auch immer sei:

            select punkte from user order by abs(punkte-14) asc limit 5

            Ergebniss:

            Array ( [0] => 14 )                14 ist 0 weg von 14
            Array ( [0] => 10 )                10 ist 4 weg von 14
            Array ( [0] => 5 )                 5 ist 9 weg von 14
            Array ( [0] => 0 )                 0 ist 14 weg von 14
            Array ( [0] => 0 )                 0 ist 14 weg von 14

            select punkte from user order by abs(punkte-10) asc limit 5

            Array ( [0] => 10 )               10 ist 0 weg von 10
            Array ( [0] => 14 )               14 ist 4 weg von 10
            Array ( [0] => 5 )                5 ist 5 weg von 10
            Array ( [0] => 0 )                0 ist 10 weg von 10
            Array ( [0] => 0 )                0 ist 10 weg von 10

            select punkte from user order by abs(punkte-271) asc limit 5
            Array ( [0] => 271 )              271 ist 0 weg von 271
            Array ( [0] => 340 )              340 ist 69 weg von 271
            Array ( [0] => 121 )              121 ist 150 weg von 271
            Array ( [0] => 435 )              435 ist 164 weg von 271
            Array ( [0] => 14 )               14 ist 257 weg von 271

            du wolltest doch die dichtesten werte ??? oder ???

            was ist nun falsch ?????

            1. Hiho,

              nein, da habe ich mich wohl ungenau ausgedrückt. Ich wollte die 10 Einträge drumherum. Am besten lässt sichd as wohl einfach am Objekt selber erklären. Ich habe eine Tabelle in der verschiedene Punktzahlen stehen. Nun möchte ich eine verkürzte Highscore ausgeben. Sprich der User soll sich selber in der Mitte der angezeigten Highscore sehen und dann die Plätze um ihn herum. Damit er schnell erkennen kann: Ich brauche 5 Punkte für einen Platz besser, mit 7 bin ich zwei besser und wenn ich 3 verliere bin ich 4 Plätze schlechter oder so.

              Grüsse

              Marc