Autor | Zpráva | ||
---|---|---|---|
ferda999 Profil |
#1 · Zasláno: 21. 2. 2024, 11:00:04
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 |
#2 · Zasláno: 21. 2. 2024, 12:35:05
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; No a když to bude očíslované, tak se to dá v dalším kroku vyfiltrovat na konkrétního uživatele. |
||
ferda999 Profil |
#4 · Zasláno: 22. 2. 2024, 05:18:49
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 |
#6 · Zasláno: 22. 2. 2024, 11:26:54
Kajman:
Takto to funguje dle mého požadavku, moc děkuji za radu |
||
RastyAmateur Profil |
#7 · Zasláno: 22. 2. 2024, 12:08:27
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 |
#8 · Zasláno: 22. 2. 2024, 12:37:57
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 |
#9 · Zasláno: 22. 2. 2024, 13:33:32
Jo tak EXPLAIN, ne DESCRIBE, je ten příkaz... Super, díky za objasnění :)
|
||
Časová prodleva: 12 měsíců
|
0