Autor | Zpráva | ||
---|---|---|---|
danhill Profil |
#1 · Zasláno: 14. 1. 2017, 13:24:58
Ahoj,
potřeboval bych pomoci s dotazem. Mám tabulku `finds` Z této mě zajímá sloupec 'code' V tabulce je přes 70 000 řádků a hodnoty 'code' se opakují. Tahám si z ní pomocí dotazu : SELECT `code`, COUNT(code) AS pocet FROM finds GROUP BY code HAVING pocet > 1 ORDER BY `pocet` DESC LIMIT 10 10 nejvíce opakujících se hodnot 'code'. Tohle chodí bez problémů. Ale pak mám druhou tabulku `final` kde je taky sloupec 'code', ale v této tabulce je 'code' unikátní hodnota. Ke každému 'code' je přiřazena v druhé sloupci této tabulky hodnota 'name' Tato druhá tabulka `final` obsahuje cca 30000 řádků různých hodnot 'code'. A já potřebuji JOIN do této druhé tabulky, abych každému z 10 'code' z prvního výsledku přiřadil 'name' z druhé tabulky. Pokusil jsem se to udělat dotazem: SELECT a.code,b.name, COUNT(a.code) AS pocet FROM finds a INNER JOIN final b ON a.code = b.code GROUP BY a.code HAVING pocet > 1 ORDER BY `pocet` DESC LIMIT 10 Což sice správný výsledek vyhodí: 'code' 'name' 'pocet' Ale dotaz je špatně sestavený,protože nevyčítá jen těch 10 code co mě zajímá,ale vyhledává name pro každý jeden code a to způsobí,že takový dotaz trvá i 100s Takže musí být jistě napsaný jinak. Napadá mě třeba funkce UNION,ale nevím, vy možná vědět budete ... Moc děkuji. |
||
TomášK. Profil * |
#2 · Zasláno: 14. 1. 2017, 13:39:39
SELECT t.code, t.pocet, final.name FROM ( SELECT `code`, COUNT(*) AS pocet FROM finds GROUP BY code HAVING pocet > 1 ORDER BY `pocet` DESC LIMIT 10[/ ) t JOIN final USING(code) |
||
TomášK Profil |
#3 · Zasláno: 14. 1. 2017, 13:43:03
Koukám ještě na ten čas - 100s. Původně jsem četl 100 ms a zdálo se mi to hodně, ale ne tak, abych to zmínil. 100 s znamená, že se nepoužívají indexy, jsou tam nějaké? MySQL je pokud si dobře vybavuju definuje samo při definici cizích klíčů, jsou ty definované?
|
||
danhill Profil |
#4 · Zasláno: 14. 1. 2017, 14:41:23
No tenhle Tvůj dotaz je teda už mnohem rychlejší. Vypíše to za 100ms.
Je pravda, že po dotazu napíše phpMyAdmin hlášku: "Aktuální výběr neobsahuje unikátní klíč. Editování v mřížce, zaškrtávací políčka nebo odkazy na editaci a mazání proto nejsou k dispozici." Ale abych se přiznal, nevím co znamenají indexy a definice cizích klíčů. Jediné co tam mám nastavené, tak v obou tabulkách jesou definovány dva klíče. Jeden je vždy PRIMARY a v něm je ID - to je AI id řádku v tabulce. Druhý klíč v tabulce finds jsem přidával jako INDEX na pole code a user. A druhý klíč v tabulce final je také INDEX na pole archive a code. Ale tohle je kvůli jiným dotazům z jiných funcí. Trochu se bojím do toho vrtat,protože těm klíčům fakt nerozumím, tak aby se mi nezhroutily jiné funkce na webu. |
||
Časová prodleva: 6 let
|
0