Autor Zpráva
ferda999
Profil
Zdravím, prosím jak při výběru konkrétní položky zjistit současně i pořadí dle setřídění např. mám položky
name:Petr kc:200
name:Vasek kc:1000
name:Honza kc:500

select * from table where name='Vasek' order by kc
tzn. jak současně ziskat poradi=3

Děkuji
RastyAmateur
Profil
Ahoj, asi bych to raději udělal přes dva dotazy. V jednom dotazu si vytáhneš informace o Vaškovi a v druhém dotazu si vybereš pouze počet záznamů, které mají sloupeček KC nižší než 1000. Bude to jednodušší a čitelnější.

Nebo je nějaký důvod, proč to vyloženě potřebuješ mít v jednom dotazu? Jako možná by to šlo nějakým vnořeným dotazem, nebo tak něco, ale myslím si, že to bude akorát hůře čitelné a nemyslím si, že by to výkonově bylo lepší.
Keeehi
Profil
Pro vygenerování pořadí se dají použít Window Functions. (V mysql jsou od verze 8)
SELECT
  name,
  kc,
  row_number() OVER (order by kc ) AS poradi
FROM
  tabulka;
Případně použijte funkci rank nebo dense_rank. Záleží jak to chcete číslovat, když nastane případ že dva lidé mají stejně peněz. Každá to dělá trochu jinak.

No a když to bude očíslované, tak se to dá v dalším kroku vyfiltrovat na konkrétního uživatele.
ferda999
Profil
Keeehi:
Děkuji za tip, ale toto řešení pro mě asi není bohužel dostupné
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'OVER
Kajman
Profil
Window funkce (v mariadb od verze 10.2) jsou vhodné, pokud se počítá pořadí pro více řádků. Pokud se zobrazuje detail Vaška a je potřeba znát pořadí jen pro něj, použil bych také jen počet menších a přičetl jedničku. Jestli to budou dva dotazy nebo jeden, by mělo být z hlediska výkonu celkem jedno, spíš jde o přehlednost v kódu. Jedním by to bylo něco jako
SELECT t.*,
       (SELECT Count(*)
        FROM   `table` t2
        WHERE  t2.`kc` < t.`kc`)
       + 1 poradi
FROM   `table` t
WHERE  `name` = 'Vasek'
ferda999
Profil
Kajman:
Takto to funguje dle mého požadavku, moc děkuji za radu
RastyAmateur
Profil
Kajman:
Jestli to budou dva dotazy nebo jeden, by mělo být z hlediska výkonu celkem jedno
Jen pro zajímavost - jsi si tím jistý? Já moc nevěděl, kde to hledat, takže jediným mým zdrojem je ChatGPT, který mi potvrdil, že vnořený dotaz se vyhodnotí pro každý řádek v tabulce bez ohledu na WHERE klauzuli. Tedy pro N záznamů to vždy projde stejných N záznamů znovu, celková komplexita je tedy N^2.

Zatímco při použití dvou dotazů se tabulka projde jen jednou, najde se Vašek, a pak se projde podruhé, aby sečetla řádky s menším číslem. Komplexita klesne na 2N.

Chápu, že ferda999 asi nemá databázi o milionech záznamů, aby tohle musel řešit, ale mě by to zajímalo... Procházel jsem spoustu článků a dokumentací, ale nikde jsem nenašel moc detailů a nemám po ruce žádný server, kde bych si mohl vytvořit tabulku a zkusit kouzlit s describem, popř. si to změřit sám.
Kajman
Profil
Lepší se podívat do explain než věřit prolhanému chatgpt. Když by byl ten poddotaz ve where části bez další podmínky, tak bych to čekal, takto v select části by se měl dělat jen pro jeden řádek (pokud tam je jeden Vašek).
RastyAmateur
Profil
Jo tak EXPLAIN, ne DESCRIBE, je ten příkaz... Super, díky za objasnění :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0