Autor Zpráva
Jan Matoušek
Profil
Zdravím,
chtěl bych poprosit o radu.

Mám 2 tabulky:

instituce:
ID, id_okresu, atd...

okres
id, nazev, atd...

Problém je, že id okresu není číslo a obsahuje například
11
1125
11A0
11B0

a když napíši:
SELECT instituce.nazev, okres.id
FROM instituce
LEFT JOIN okres ON instituce.id_okresu = okres.id

tak mi to vrátí u instituce, kde je id_okresu 11

11
11A0
11B0

Nikdy jsem se s tím nesetkal, jelikož jsem měl vždy id čísla, bohužel u této databáze je tomu jinak.

Napadlo mě to řešit group by, jenže někdy dotaz pracuje s 250 000 položkami a i když si dám limit například 50, tak group by řadí všech 250 000 položek (potřebuji dostat přesně 50, takže nemohu seskupovat až po limitu)

EDIT: chyba opravena
Camo
Profil
Nechápem ako to môže fungovať, lebo máš chybnú syntax.
SELECT tb1.col1, tb1.col2 from tb1 LEFT JOIN tb2 ON tb1.col1=tb2.col7
EDIT:
Ku tomu zrýchleniu ma napadlo niečo takéto:
SELECT okres.id, inst.nazev FROM okres RIGHT JOIN (select nazev from instituce limit 50) as inst ON okres.id=inst.id;
Indexy tam hádam sú.
Camo
Profil
OTÁZKA:
Keď ten môj "optimalizovaný" select skúmam cez príkaz EXPLAIN tak mi to ukazuje, že LIMIT nemá na efektivitu žiadny vplyv. Ak teda dobre rozumiem stĺpcu ROWS - že ukazuje počet riadkov, ktoré musel ten príkaz prečítať. Keď tam pridám ORDER BY tak to ten LIMIT zohľadňuje ako som čakal. Ale nechápem aký je v tom rozdiel.
EDIT:
Aha, takže som mylne predpokladal, že existuje nejaké defaultné radenie...
Takže by to mohlo vyzerať nejako takto:
SELECT tb1.col1, tb1.col2, tb2.colX FROM tb1 LEFT JOIN tb2 ON tb1.col1=tb2.col1 ORDER BY tb1.col1 LIMIT 3;
Jan Matoušek
Profil
díky za odpověď, teď jen odepisuji. Později vyzkouším. (tenhle kód by samozřejmě nefungoval. Je tam chyba. Psal jsem to z hlavy zjednodušeně) Indexy samozřejmě jsou
Camo
Profil
Aj tak mi to príde nelogické, že ten LIMIT nezohľadní ak tam nieje ORDER BY. Podľa mňa by to malo vybrať prvých X záznamov na ktoré narazí. Ani najobyčajnejší select to nezohľadní. Nabúralo mi to celú predstavu o klauzule LIMIT. Neviem prečo som si myslel, že okrem iného to zrýchľuje výber z DB.
Ako to je teraz????
Virtus
Profil
Pokud dotaz obsahuje ORDER BY, provede se prvně seřazení všech záznamů, až poté se výsledek omezí přes LIMIT.
Pokud jsou v dotazu agregační funkce, provedou se prvně ty a až po jejich provedení se omezí počet výsledků přes LIMIT.
To samé platí pokud je v dotazu WHERE, prvně se vyberou všechny řádky, které odpovídají podmínce a poté se výsledek omezí přes LIMIT.
Pokud mám nastavený u LIMITu i od jakého řádku se má vybírat (LIMIT 60, 20 / LIMIT 20 OFFSET 60) databáze vybere prvních 80 řádků a poté prvních 60 řádků zahodí nebo vybere prvních 60, ty zahodí a poté vrátí následujících 20, tady si nejsem úplně jistej, jak to probíhá, každopádně, těch 80 řádků se vybere pokaždé.
Podmínka u JOIN, tedy to co následuje za ON, je v podstatě obdoba WHERE a LIMIT se tedy opět provede až poté, co se vyberou všechny řádky, které odpovídají podmínce.
Před LIMIT má přednost skoro všechno, co můžete v dotazu, ve kterém je možné použít LIMIT, použít, co mně napadá, před čím má LIMIT přednost, je třeba UPDATE, INTO OUTFILE, DELETE.
Camo
Profil
Virtus:
Díky.

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