Autor Zpráva
4ever
Profil
Měl jsem původně dva dotazy, ve kterém jsem vybral a seřadil data ze dvou tabulek, které mají společné id. Dělal jsem to bez JOIN tak, že podmínka pro WHERE byla a.`id`==b.`aid`. Teď používám jinou syntaxi:

Výběr předchozího (je rychlý, okamžitá reakce)
SELECT  *  FROM basic AS a JOIN detaily AS b WHERE  a.`id` < 13
 ORDER BY  a.`id` DESC  LIMIT 0,1  


Výběr následujícího:
SELECT  *  FROM basic AS a JOIN detaily AS b WHERE  a.`id` > 13
 ORDER BY  a.`id` ASC  LIMIT 0,1  
 


A právě u toho Následujícího se mi to před chvílí zdálo nějak pomalé. Neměřil jsem to, protože nevím jak se to dělá, ale připadalo mi to tak 0.4-0.5 vteřiny odezva. Teď možná o něco rychlejší tak 0.3. Tak se chci zeptat jestli je to možné, protože měl jsem dojem že se to při té staré syntaxi načítalo prakticky okamžitě.

Mám celkem 128 řádků v obou tabulkách.
Joker
Profil
4ever:
Neměřil jsem to
To je právě chyba. Pokud ten dotaz „vypadá pomalý“, měl by další krok být měření, aby se potvrdilo, jestli to je opravdu tím dotazem.

Jinak ale ten dotaz skoro určitě bude špatně.
Je to výběr z basic AS a JOIN detaily AS b, tedy kartézského součinu obou tabulek (tj. pokud každá tabulka má 128 řádků, vytvoří se tabulka s 16 384 řádky obsahující všechny kombinace)
Vybere se jedno nejvyšší a.id menší než 13.

…ale v té spojené tabulce jsou všechny kombinace, tj. například záznam tabulky basic s ID=12 tam bude (počet řádků tabulky detail)-krát (vždycky zkombinovaný s jiným řádkem tabulky detail).
Čili tenhle dotaz může vrátit řádek tabulky basic s nejvyšším ID nižším než 13 v kombinaci s celkem náhodným řádkem tabulky detail.

Nechybí tam basic a JOIN detaily b ON nějaká-podmínka?
4ever
Profil
Joker:
Dík za poučení. Jsem si nebyl jistý jaký je rozdíl v tom explicitním WHERE a implicitním ON i když se má používat JOIN .. ON. Mě to nějak nevyhovuje kvůli metodě kterou volám, protože ta metoda tam automaticky dosazuje WHERE .... Tak budu muset něco vymyslet jak opravit tu metodu; zatím nevím co aby to bylo hladké.
Joker
Profil
4ever:
jaký je rozdíl v tom explicitním WHERE a implicitním ON
Ono by to mohlo fungovat i s WHERE, ale JOIN ON je lepší, protože to do dočasné tabulky už vloží jen řádky splňující podmínku, zatímco JOIN bez podmínky + WHERE vytvoří tabulku se všemi kombinacemi (kartézský součin) a z ní pak teprve vybírá vyhovující řádky.
edit: Škrtnutá část asi není pravdivá, viz níže.
TomášK
Profil
Joker:
Víš to určitě? Mám za to, že ten zápis je ekvivalentní a poměrně brzo se z toho při zpracování dotazu stane totožná konstrukce, která se pak předhodí optimalizátoru. Ale jistý si tím nejsem, musel bych to dohledávat - pokud víš, že se to zpracuje různě, ušetříš mi hledání.
4ever
Profil
Joker:
Měl jsi pravdu. Opravil jsem to a dosahují okamžité reakce. Skvělé, dík za tip.

Ještě dotaz:
Tato syntaxe bez WHERE je platná?
SELECT x.* FROM  ukazka_view x INNER JOIN ukazka_view y ON  x.`id`=128  ORDER BY  x.`html` ASC  LIMIT 0,1 

Jestli tomu už rozumím, tak tzn. že ON nahradilo to WHERE tak ho už nepotřebuju ne?
Joker
Profil
TomášK:
Víš to určitě? Mám za to, že ten zápis je ekvivalentní a poměrně brzo se z toho při zpracování dotazu stane totožná konstrukce, která se pak předhodí optimalizátoru.
Aha, tak jsem to zkoušel a zdá se, že to opravdu je stejné.

Kdysi dávno jsem totiž dělal nějaké pokusy ze kterých jsem si zapamatoval, že JOIN ON je daleko rychlejší. Ale nejspíš ty dotazy nebyly úplně ekvivalentní.

Co jsem zkoušel teď, SELECT * FROM tabulka a JOIN tabulka b WHERE a.id=b.id je stejně rychlý jako SELECT * FROM tabulka a JOIN tabulka b ON a.id=b.id.
Tak odvolávám předchozí příspěvek.
4ever
Profil
Joker:
No ale je to zvláštní, protože mě to opravdu s tím ON jede vydatně rychleji.
Tori
Profil
4ever:
SQL v [#6] by mělo vypadat myslím takhle:
SELECT x.* FROM  ukazka_view x INNER JOIN ukazka_view y ON x.`id` = y.`idX` -- doplňte správné názvy  
WHERE x.`id`=128  ORDER BY  x.`html` ASC  LIMIT 0,1 
Aby tam bylo i jak se mají ty tabulky spojovat, i který řádek přesně chcete.
joe
Profil
Chybí tam ta podmínka, jak píše Tori, jinak myslím a pokud se nepletu, tak tento zápis by měl být stejný:

SELECT x.* FROM  ukazka_view x INNER JOIN ukazka_view y
WHERE x.id=128  AND x.id = y.idX ORDER BY  x.html ASC  LIMIT 0, 1
4ever
Profil
A když už se bavíme o té syntaxi, za chvíli bych potřeboval vytvořit třetí tabulku rozšiřující informace k těm předchozím. Jak ale sestavit dva selecty s pomocí join, když tam jsou tři tabulky?

Mě napadá jen toto a to teda nevím jestli je správně:
CREATE VIEW ukazka2_view AS SELECT a. * , b. *, c. *
FROM basic a
JOIN detaily b ON a.`id` = b.`basic_id` FROM next_info b
JOIN next_info c ON a.`id` = b.`basic_id` 


a

SELECT x.* FROM  ukazka3_view x INNER JOIN ukazka3_view y ON x.`id` = y.`idX`
INNER JOIN ukazka3_view z ON x.`id` = z.`idY`  
WHERE x.`id`=128  ORDER BY  x.`html` ASC  LIMIT 0,1


V podstatě budu potřebovat vytvořit náhledy pro některé sloupce vybrané ze tří tabulek a pak ty běžné selecty, které vytahují data z těch tabulek přímo. Vlastně jedno a to samé, jen jedno čistě pomocí selectu a pomocí Pohledů. Třetí příklad pro select bez pohledů jsem už radši neuvedl, beztak to mám špatně.
o_O
Profil
4ever:
FROM basic a
JOIN detaily b ON a.`id` = b.`basic_id` FROM next_info b
Proč se ve Vašem SQL dotazu vyskytuje 2× FROM?

A ano, je to špatně. Už jen kvůli stejnému "pojmenování" tabulky (next_info b, detaily b) a také kvůli chybějící vazby u next_info.

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