Autor Zpráva
MaK
Profil
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
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
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
Složitou kontrolu funkcí můžete udělat jen pro autory, co mají více než 10 knížek.
Kajman
Profil
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
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
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
Kajman:
Moc děkuji, ten trik s LIMIT 1 offset 10 mi moc pomohl.

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