Autor Zpráva
lubek
Profil *
ahoj,
nevím jestli jsem všechno správně pochopil, ale nedaří ze se mi rozběhat OUTER JOIN. Mám dvě tabulky - v jedné filmy a ve druhé hodnocení. Některé filmy již byly hodnoceny, takže v tabulce "hodnoceni" mají záznam, jiné nikoliv.

pokud spustím dotaz s INNER JOIN tak mi to vybere správně jen hodnocené filmy.
pokud spustím dotaz s LEFT JOIN popř. LEFT OUTER JOIN tak mi to vybere všechny filmy a který film není hodnocen bude mít jeho známka hodnotu NULL
ale pokus spustím jen OUTER JOIN abych získal z DB jen nehodnocené filmy, tak mi to vypíše syntaxní chybu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN `hodnoceni` h ON f.`id` = h.`id_filmu`
LIMIT 0, 30' at line 3


Zápis dotazu vypadá takto:
SELECT * 
   FROM `filmy` f
      OUTER JOIN `hodnoceni` h ON f.`id` = h.`id_filmu`


Děkuji za radu.
Alphard
Profil
Psát outer je docela exotické, správný zápis je myslím např. left outer join, ale stejně nebude fungovat, jak chcete (radši se podívejte do manuálu).

Mělo by jí
SELECT * 
   FROM `filmy` f
      LEFT JOIN `hodnoceni` h ON f.`id` = h.`id_filmu` 
    where h.id_filmu is null
lubek
Profil *
Alphard:
Proč by nemělo fungovat?

Jinak s souhlasím, že použití outer join je opravdu jak říkáte "exotické". Nicméně ho teď použít musím, protože se nejedená o řešení praktického problému, ale jen o demonstrativní ukázku jak fungují všechny typy join. A outer join popř. full outer join jsem narazil a nevím co s nimi...
Kajman_
Profil *
lubek:
ale pokus spustím jen OUTER JOIN abych získal z DB jen nehodnocené filmy, tak mi to vypíše syntaxní chybu:

Proč by nemělo fungovat?

Protože joiny takhle (bez toho zmíněného omezení díky where) nefungují. Kde jste přišel na to, že jde psát pouze outer join a že to takhle funguje?

Jinak full outer join některé databáze umí, ale mysql k nim nepatří. Ale ten by vám vypsal spojení dané podmínkou podobně jako inner join ale navíc včetně filmů, které nebyly hodnocené a včetně hodnocení, které nepatří k žádnému filmu.
lubek
Profil *
Kajman:
Protože joiny takhle (bez toho zmíněného omezení díky where) nefungují.
Toto přeci není pravda...

Jak jsem psal na začátku:
INNER JOIN – vrátí jen spárované záznamy - funguje bez WHERE
SELECT * FROM `filmy` f INNER JOIN `hodnoceni` h ON f.`id` = h.`id_filmu`


LEFT JOIN – vrátí spárované záznamy a nespárované s hodnotou NULL- funguje bez WHERE
SELECT * FROM `filmy` f LEFT JOIN `hodnoceni` h ON f.`id` = h.`id_filmu`


OUTER JOIN – by měl vrátit jen nespárované záznamy - WHERE. Pokud přidám podmínku WHERE, tak bych očekával, že budu filtrovat pouze vrácené nespárované záznamy a ne, že budu až podmínkou oddělovat tyto záznamy. Viz. LEFT JOIN od Alphard

Jak bys prosím v tomto případě OUTER JOIN zapsat ty (i treba s WHERE) a proč?
Kajman_
Profil *
lubek:
OUTER JOIN – by měl vrátit jen nespárované záznamy

V jaké dokumentaci jsi tohle chování našel? Zkus to porovnat např. s popisem na wikipedii.
lubek
Profil *
Opss… tak chyba je na mé straně! V manuálu MySQL dev.mysql.com jsem přesně nepochopil, jak outer join funguje. Hledal jsem dál a na webu a našel jsem zapsaný samotný outer join na tutorialy.vytvorweb.cz Dále jsem se asi moc zaměřil na to, abych takto samostatně zapsaný outer join rozběhal. A díky jeho názvu a špatně pochopeného manuálu jsem došel k závěru, že funguje tak jak jsem zde popsal.
Vůbec mě nenapadlo kouknout na wiki. A teď když pročítám odkaz, který jsi mi poslal, tak zjišťuji, že LEFT JOIN = OUTER LEFT JOIN je to tak? Potom ale nechápu, proč se tomu říká exotické spojení, když left join je běžně používané spojení.
lubek
Profil *
Samozřejmě LEFT OUTER JOIN a ne OUTER LEFT JOIN.
Kajman_
Profil *
lubek:
LEFT JOIN = LEFT OUTER JOIN je to tak?

Ano.

Potom ale nechápu, proč se tomu říká exotické spojení,

A kdo tomu tak říká? Jestli nebude exot spíš autor toho textu ;-)

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