ITnetwork Flashka zdarma C# týden
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Update the rank position in a MySQL Table

Aktivity (2)
Avatar
Majči Pečenadský Vitek:14. ledna 5:41

Zdravím, snažím si spraviť tabuľku, kde bude vypísaný zoznam hráčov a k ním pridané body. Ale tak, že po aktualizácií cronu, updatuje pozíciu hráča na rank napr. 1 podľa toho koľko má bodov.

Príklad tabuľky Mysql:

ID Rank Name Body
1 2 Peter 35
2 1 Milan 15

Aby po aktualizovaní cronu bola tabuľka takto:

Rank Name Body
1 Peter 35
2 Milan 15

Ďakujem za skorú odpoveď.

Zkusil jsem: Skúsil som tento kód ale nefungoval.

$result = mysqli_query($conn,"SET @r=0;
              UPDATE table SET rank= @r:= (@r+1) ORDER BY body DESC;
              SET @r=0; SELECT *, @r:= (@r+1) as rank
              FROM table ORDER BY body DESC;") ;
 
Odpovědět 14. ledna 5:41
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:14. ledna 7:57

???

SELECT id, body, COUNT(*) AS rank
FROM tabulka
ORDER BY BODY DESC

To ti vypise celou tabulku se spravnym rankem a ted to potrebujes jen zapsat.
google = select update sql -> https://stackoverflow.com/…n-sql-server

UPDATE table
SET Col1 = i.Col1,
    Col2 = i.Col2
FROM (
    SELECT ID, Col1, Col2
    FROM other_table) i
WHERE
    i.ID = table.ID
Editováno 14. ledna 7:57
 
Nahoru Odpovědět 14. ledna 7:57
Avatar
Odpovídá na Majči Pečenadský Vitek
Michal Šmahel:14. ledna 8:03

Ahoj, trochu to zavání chybou v návrhu. Jednotlivé sloupce by měly být závislé pouze na primárním klíči, nikoliv sami na sobě. Lepší by možná bylo rank zjišťovat vždy při selectu.

Pokud však má toto řešení nějaký hlubší důvod, je samozřejmě možné napsat dotaz, který hodnoty opraví. Bude však nutností použít pokročilejší konstrukci SQL.

CREATE PROCEDURE renew_ranks()
BEGIN
    DECLARE v_id INT;
    DECLARE v_points INT;
    DECLARE v_actual_rank INT DEFAULT 1;
    DECLARE v_done BOOLEAN DEFAULT false;

    DECLARE c_tableItems CURSOR FOR
        SELECT id, points
        FROM table
        ORDER BY points DESC;

    DECLARE HANDLER FOR NOT FOUND
        SET v_done = true;

    OPEN c_tableItems;

    read: LOOP
        FETCH c_tableItems INTO v_id, v_points;

        IF v_done THEN
            LEAVE read;
        END IF;

        UPDATE table
        SET rank = v_actual_rank
        WHERE id = v_id;

        SET v_actual_rank = v_actual_rank + 1;
    END LOOP;
END

Je to psané na telefonu, takže neručím za funkčnost. Případně ještě napiš.

Nahoru Odpovědět 14. ledna 8:03
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
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 3 zpráv z 3.