/MYSQL: 11 Einträge um einen Wert herum
AllesMeins
- datenbank
0 nobody0 AllesMeins0 nobody0 AllesMeins0 nobody
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
select * from tabelle
order by abs(spalte-wert) asc
limit 11
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...
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.
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
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 ?????
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