Autor | Zpráva | ||
---|---|---|---|
MaK Profil |
#1 · Zasláno: 19. 12. 2018, 08:53:11
Mám dvě tabulky:
CREATE TABLE autori ( autor_id INTEGER ); CREATE TABLE publikace ( publikace_id INTEGER, autor_id INTEGER ); Chci seznam vsech autoru, kteří napsali méně nebo právě 10 publikací. Ale mám jednu podmínku. Pokud autor napsal více jak 10 publikací, nebude dotaz počítat celkový počet a u 10 skončí. Bude "šetřit" procesor. Pro jednoho autora to umím: SELECT COUNT(*) FROM ( SELECT 1 FROM publikace WHERE autor_id = XYZ LIMIT 10 ) AS dt; , ale pro více autorů to na MySQL nedokážu. Předem díky za rady. |
||
Kajman Profil |
#2 · Zasláno: 19. 12. 2018, 09:18:28
Pokud bude nad sloupcem autor_id index, tak je jedno, jestli bude mít jednu nebo tisíc knížek, bude to skoro stejně rychlé...
SELECT autor_id, Count(*) pocet FROM publikace GROUP BY autor_id HAVING Count(*) <= 10 |
||
MaK Profil |
#3 · Zasláno: 19. 12. 2018, 09:31:05
Kajman:
Pokud bude nad sloupcem autor_id index, tak je jedno, jestli bude mít jednu nebo tisíc knížek, bude to skoro stejně rychlé... Kajman Bohužel se v reálu musí každá publikace propojit s dalšími dvěma tabulkami + přidat podmínky do where, aby se zjistilo, jestli je započitatelná. Povedlo se mi to přes "CREATE FUNCTION...": SELECT autor_id FROM autori WHERE ... AND mojeFunkce(autor_id) <= 10 Ale raději bych se tomu vyhnul. |
||
Kajman Profil |
#4 · Zasláno: 19. 12. 2018, 09:36:49
Složitou kontrolu funkcí můžete udělat jen pro autory, co mají více než 10 knížek.
|
||
Kajman Profil |
#5 · Zasláno: 19. 12. 2018, 09:48:34
Pro zajímavost můžete rychlost ještě porovnat s korelovaným poddotazem.
SELECT autor_id FROM autori LEFT JOIN (SELECT (SELECT autor_id FROM slozita_filtrace_knizek LIMIT 1 offset 10) autor_id FROM publikace GROUP BY autor_id HAVING Count(*) > 10) nechci ON autori.autor_id = nechci.autor_id WHERE nechci.autor_id IS NULL |
||
MaK Profil |
#6 · Zasláno: 19. 12. 2018, 09:48:48
Kajman:
„Složitou kontrolu funkcí můžete udělat jen pro autory, co mají více než 10 knížek.“ Jako že přes index zjistit "nahrubo" a přes funkci "najemno"? Bez funkce to nejde? |
||
Kajman Profil |
#7 · Zasláno: 19. 12. 2018, 09:52:49
Když nemá 10 knížek bez filtrace, tak nemůže mít více než deset knížek s podrobnou filtrací na další podmínky. Proto se ta jemná filtrace nemusí dělat pro všechny autory, ale jen pro ty, co mají více knížek.
|
||
MaK Profil |
#8 · Zasláno: 19. 12. 2018, 10:37:59
Kajman:
Moc děkuji, ten trik s LIMIT 1 offset 10 mi moc pomohl. |
||
Časová prodleva: 5 let
|
0