Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ondra Novák
Člen
Avatar
Ondra Novák:10.4.2020 3:54

Ahoj,
jsem v SQL opravdu čerstvý nováček, proto možná bude můj dotaz zodpovězen během 10 vteřin.

Řeším problém kdy mi do SQL tabulky chodí data, která potřebuji neustále třídit (dle hodnot) podle dvou sloupců. Sloupec A vzestupně a pokud mají sloupce A stejnou hodnotu tak dotřídit podle sloupce B + Aktualizovat tabulku (Z tabulky jsou data zase opět interpretována a potřebují být setříděna - jedná se o tabulku se záznamem highscore). Tento SQL dotaz bych posléze šoupnul do triggru, kde by se mi po změně tabulky spouštěl. Tabulka by se setřídila a aktualizovala zatříděná. SQL dotaz na třídění již mám vytvořen:

SELECT highlevel, highscore, highname
FROM WorldHighScore
ORDER BY highlevel DESC , highscore ASC
LIMIT 0 , 100

Nicméně ted nevím, jak v SQL updatuji tabulku na základě vytvořeného SQL dotazu. Můžete mi prosím poradit? Popřípadě navést na jiné řešení?

Děkuji, Ondra

Zkusil jsem: SELECT highlevel, highscore, highname
FROM WorldHighScore
ORDER BY highlevel DESC , highname ASC
LIMIT 0 , 100

Chci docílit: Pokud by existovalo řešení, kdy bych pouze vkládal nové hodnoty dle třídění. Udělal bych prostě cyklus na sloupec A a pak cyklus na sloupec B bylo by to také řešení. Nicméně SQL proti objektovému jazyku je pro mě docela peklo :-/

 
Odpovědět
10.4.2020 3:54
Avatar
Jan Stodůlka
Tvůrce
Avatar
Jan Stodůlka:10.4.2020 10:51

A k čemu ti to setříděné bude? Předpokládám, že to pak budeš vracet klientům a opět to budeš třídit.
Možná by bylo lepší si to setříděné načíst (podle tvého selectu) a držet v cache na serveru třeba 10-15 minut. Po té době to zahodit a znova setříděné načíst.
Případně to můžeš zahodit v okamžiku kdy aktualizuješ skore, ale min po10-15 minutách.

Ještě se zamysli zda je bezpodmínečně nutné vždy zobrazovat aktuální seznam, třeba ti to s prodlevou 10-15 minut bude stačit. Bude se to tak často měnit? Nebude ti to moc zatěžovat server?...

Nahoru Odpovědět
10.4.2020 10:51
Nechodím do hospody, protože doma programuji.
Avatar
Ondra Novák
Člen
Avatar
Odpovídá na Jan Stodůlka
Ondra Novák:10.4.2020 11:22

No setřídit to chci, protože pak budu jednoduše vracet row_id jako pořadí. Kdo je první kdo druhý atd. Potřebuji ale, ale kdykoliv se někdo dostane do prvních XX záznamů, tak aby další uživatelé měli tento záznam reatime.

V noci jsem nespat a vytvořil jsme malinko odlišný dotaz, který je přesně to, co potřebuji.

ALTER TABLE WorldHighScore ORDER BY highlevel DESC, highday ASC

A moje idea je, že bych to spustil triggerem after insert, jenže to mi hází error. SQL dotaz funguje, proč ho tedy nemohu vložit do triggeru?

Pokoušel jsme se volat tento dotaz i z PHP ( $sql = "ALTER TABLE WorldHighScore ORDER BY highlevel DESC, highday ASC";

Ale to mi také nefungovalo :(

 
Nahoru Odpovědět
10.4.2020 11:22
Avatar
Ondra Novák
Člen
Avatar
Odpovídá na Ondra Novák
Ondra Novák:10.4.2020 12:08

Ahoj, tak vlákno se dá uzavřít. Nakonec jsme to udělal tedy tak že při zapisování hodnot z PHP si tam posílám i SQL dotaz na zatřídění:

$query = "ALTER TABLE WorldHighScore ORDER BY highlevel DESC, highday ASC";
$query2 = "INSERT INTO WorldHighScore (highlevel, highday, highname) VALUES ('$highlevel', '$highday', '$highname')";

$result = mysqli_query($dbc, $query2);
$result = mysqli_query($dbc, $query);

Kupodivu to funguje :D

 
Nahoru Odpovědět
10.4.2020 12:08
Avatar
Odpovídá na Ondra Novák
Michal Štěpánek:11.4.2020 17:51

No, nejsem si zrovna jistý, že toto řešení je ideální. Já bych asi spíš vytvořil nějaké view, kde by se ty hodnoty řadily podle tvé potřeby. Měnit tabulku při každé změně nějakého mi nepřijde správné řešení ani programově a možná ani výkonově...

Nahoru Odpovědět
11.4.2020 17:51
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Barbora Stojanová:20.4.2020 0:56
  • view blbost, vykonnostne stoji zaprd.
  • pokud chces radit, pouzivej to az v selectu pomoci order by... muzes v tabulce vytvorit index a vysledek selectu se ti zobrazi ani nemrknes
 
Nahoru Odpovědět
20.4.2020 0:56
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.4.2020 9:49

Viz Barbora. View ma smysl, pokud mas na to hw architekturu, ktera uklada view do rychleho hw, treba velmi velke pameti nebo velmi rychleho disku.
To, co potrebujes, tez Barbora, lze resit tak SELECTEM, ktery pouzivas. Bud a nebo dvoji select. Poradi si tam preci muzes pridat pres COUNT(*)

SELECT
    `highlevel`,
    `highscore`,
    `highname`,
    COUNT(*) AS `poradi`
FROM
    `WorldHighScore`
ORDER BY
    `highlevel` DESC,
    `highscore` ASC
LIMIT 0 , 100
 
Nahoru Odpovědět
20.4.2020 9:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.