Autor Zpráva
Ajtak
Profil
Zdravím. Mám SQL dotaz, který používám v MySQL, zde je vše ok. a já bych chtěl pomoci, jak tento dotaz převést do formátu, abych mohl pracovat nad SQLite databází, nikoliv nad MySQL.
 SELECT player, wins, diff,rank from
 (
 SELECT player, wins, diff, @winrank := @winrank + 1 AS rank
 from tmpPoradi,(SELECT @winrank := 0) r 
 ORDER BY wins DESC,diff DESC
 )  rt
ORDER BY player

Děkuji za pomoc s úpravou dotazu, nebo popř. radu, jak tohoto docílit pomocí PHP.
juriad
Profil
V SQLite neexistují tyto proměnné. Tam jsou čtyři možná řešení:
1) počítat počet záznamů, které mají menší hodnotu, ale to je hodně výkonově náročné (pro každý řádek se prakticky spouští další poddotaz)
2) dočasná tabulka, ale ta zase vyžaduje nějakou správu a zabírá místo v paměti
3) mít rank předpočítaný už v té tabulce a při jejích úpravách (INSERT, UPDATE, DELETE) triggerem upravovat i to pořadí
4) číslování doplnit až při zpracování v PHP

Osobně bych asi šel do 4. možnosti. Vytáhni si data bez řazení podle hráče, tedy vlastně budou seřazené podle wins a diff, což definuje rank. A následně si výsledky uložíš do pole včetně ranku (který jsi dopočítal při vytahování záznamů). Toto pole seřadíš pomocí usort podle hráče a vypíšeš.
Ajtak
Profil
juriad:
Tady jde hlavně o to, že když jsou dva řádky se stejnou hodnotou, jak wins, a diff, aby měly oba záznamy např. rank 3, a následující měl rank 5

takže třeba:
Player | Wins | Diff | Výsledný (požadovaný) rank
Aaa | 4 | 8 | 1
Bbb | 3 | 5 | 2
Ccc | 1 | 3 | 3
Ddd | 1 | 3 | 3
Eee | 0 | 8 | 5
juriad
Profil
A co je za problém?
To jen eliminuje možnost číslo 2. V PHP je zpracování jednoduché:

$rows = []; # výsledné pole řádků, se kterým si můžeš dělat, co chceš
$lastWins = NULL;
$lastDiff = NULL;
$rank = 1; # rank, který se přiděluje
$count = 0; # počet kolikrát byl přidělen
while($row = ...) {
  # pokud se liší v alespoň jednom, dožeň rank
  if ($row['wins'] != $lastWins || $row['diff'] != $lastDiff) {
    $lastWins = $row['wins'];
    $lastDiff = $row['diff'];
    $rank += $count;
    $count = 0;
  }
  $row['rank'] = $rank;
  $rows[] = $row;
  $count++;
}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0