Autor | Zpráva | ||
---|---|---|---|
Ajtak Profil |
#1 · Zasláno: 22. 11. 2015, 15:26:21
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++; } |
||
Časová prodleva: 8 let
|
0