tamin
17.03.2004, 17:49:53
Mam tabelke ranking w mysqlu:
id | nazwa | licznik
i teraz mam powiedzmy 50 rekordow w tej tabelce. Niektore maja jednakowy stan licznika.
1. Jakie zapytania zadac bazie zeby pokazalo mi aktualne miejsce w rankingu dla rekordu o podanym id?
Chcialbym zeby miejsca byly pokazywane tak:
miejsce | nazwa | wejsc
1. nazwa 31
2. nazwa2 28
3. nazw1 25
3. nazw5 25
Czyli jak dwa rekordy maja taka sama liczbe wejsc to zajmuja to samo miejsce.
I nie mam pojecia jak wyswietlic miejsce konkretnego rekordu i jak wyswietlic pierwsze 10 miejsc (moze to byc wiecej niz 10 rekordow, bo licza sie miejsca w rankingu).
shima
17.03.2004, 18:23:20
Daj fragment kodu, przynajmniej zapytania do bazy, bo łatwiej się przerabia niż pisze od podstaw.
Wankster
17.03.2004, 18:41:09
[php:1:8921f10028]<?php
// pobieranie pol id, nazwa, licznik do zmiennej $rows
// SELECT id, nazwa, licznik FROM ranking ORDER BY licznik DESC
$rows = array
(
array( 2, 'Wankster' , 666 ),
array( 1, 'Cudi' , 665 ),
array( 6, 'Seth' , 575 ),
array( 10,'itsme' , 575 ),
array( 7, 'GrayHat' , 123 ),
array( 8, 'kawiateek', 103 ),
array( 4, 'Sh4dow' , 43 ) ,
array( 3, 'Cichy' , 31 ) ,
array( 9, 'Anubis' , 31 ) ,
array( 5, 'kubatron' , 31 )
);
function sortRanking( &$arrRanking )
{
$ranking = array();
foreach ( $arrRanking AS $key => $value )
{
$k = placeExists( $value[2], $ranking );
$p = $k !== false ? $ranking[ $k ][0] : getLastPlace( $ranking );
$ranking[] = $k !== false ? array( $p, $value[1], $value[2] ) : array( $p, $value[1], $value[2] );
}
$arrRanking = $ranking;
}
function placeExists( $intHits, $arrRanking )
{
foreach ( $arrRanking AS $k => $v )
{
if ( $v[2] == $intHits ) return $k;
}
return false;
}
function getLastPlace( $arrRanking )
{
static $place = 1;
foreach ( $arrRanking AS $k => $v )
{
if ( $place === $v[0] ) $place = $v[0] + 1;
}
return $place;
}
sortRanking( $rows );
print 'Ranking:';
foreach ( $rows AS $k => $v )
{
print "n " . $v[0] . '. ' . $v[1] . ': ' . $v[2];
}
?>[/php:1:8921f10028]
1. Określony ID[sql:1:8921f10028]SELECT nazwa, licznik FROM ranking WHERE id = $jakisTamId LIMIT 1[/sql:1:8921f10028]
2. Pierwsze x miejsc[sql:1:8921f10028]SELECT id, nazwa, licznik FROM ranking ORDER BY licznik DESC LIMIT x[/sql:1:8921f10028]
shima
17.03.2004, 19:27:59
[php:1:6e9b836157]<?php
$z = "SELECT id, nazwa, licznik FROM ranking
ORDER BY licznik DESC LIMIT 5";
//ściąga już posortowane
$aktualna_pozycja = 1; //pierwszy ma numer 1
$aktualny_licznik = 3000000;
/*licznik w kosmos -> musi być większy od
największego w bazie*/
$p = mysql_query($z);
while ($aktu = mysql_fetch_array($p))
{
$ranking[$aktu['id']]= $aktualna_pozycja;
if ($aktu['licznik'] < $aktualny_licznik)
{
$aktualny_licznik=$aktu['licznik'];
$aktualna_pozycja++;
}
}
//tutaj masz tablicę id=>pozycja, dopasować już pewnie umiesz
foreach ($ranking as $k=>$v) //sprawdzam czy dobrze wypisuje
{
echo $k.'=>'.$v.'<br>';
}
//jeżeli nie chcesz bawić się z dodatkowym dopasowywaniem, to podmień $aktu[id]
//na $aktu['nazwa']
?>[/php:1:6e9b836157]