Autor Zpráva
Nox_
Profil *
Ahoj, mám problém s dotazem na Dtb.
Dotaz: SELECT AutoNPC.Jmeno AS JmenoNPC, AutoNPC.Pohlavi AS PohlaviNPC, AutoNPC.Povaha AS PovahaNPC, AutoNPC.Nalada AS NaladaNPC
FROM AutoNPC, TypNPC, Cas
WHERE AutoNPC.Objekt LIKE 1
AND AutoNPC.Lokace LIKE 1
AND Cas.Hodina >= TypNPC.Vstavej
AND TypNPC.Spi < Cas.Hodina
, mi vrací zvojenné hodnoty, je to tím, že nemám spojené tabulky?
Pokud ano, mohl bych mi nekdo prosim pomoct se spojeni, pokousel jsem se o to, ale pak mi nesly dotazy, takze to resim v selectu, kde primarni klic se rovna ID, které je nastaveno na serveru v sessions.
Nox_
Profil *
A pokud ne, čím to může být?
Kajman_
Profil *
Asi že nemáte v podmínkách vazbu mezi AutoNPC a TypNPC.
Joker
Profil
Nox_
je to tím, že nemám spojené tabulky?
Spíš je to tím, že se dělá kartézský součin těch tabulek, tj. všechny kombinace.
Příklad: když budu mít tabulku 2x2 s hodnotami (a,b), (c,d) a druhou tabulku 2x2 s hodnotami (1,2),(3,4), bude jejich kartézský součin:
a,b,1,2
a,b,3,4
c,d,1,2
c,d,3,4
...tzn. každá jednotlivá hodnota se tam vyskytuje dvakrát (obecně tedy "počet řádků té druhé tabulky"-krát)

Mimochodem to může být dost výkonově náročné, už pokud bude mít každá tabulka třeba jen tisíc řádků, bude se SELECT dělat ze složené tabulky o miliardě řádků.
Odhaduju, že správně by ten dotaz měl být:
FROM AutoNPC a (LEFT?) JOIN TypNPC t ON nejakapodminka (LEFT?) JOIN Cas c ON dalsipodminka
Nox_
Profil *
Takže způsob jak se vyhnou kartézskému součinu je používat spojení tabulek?
Chápu to správně?
Nox_
Profil *
Tak jsem trochu studoval kauzale JOIN a podařilo se mi splodit tento dotaz:

SELECT AutoNPC.Jmeno AS JmenoNPC,AutoNPC.Pohlavi AS PohlaviNPC,AutoNPC.Povaha AS PovahaNPC,AutoNPC.Nalada AS NaladaNPC FROM AutoNPC JOIN TypNPC ON AutoNPC.Typ_NPC = TypNPC.Typ_NPC JOIN Cas ON TypNPC.Vstavej <= Cas.Hodina AND Cas.Hodina < TypNPC.Spi WHERE AutoNPC.Objekt LIKE 1 AND AutoNPC.Lokace LIKE 1

Tváří se, že je ok, tak uvidím :)
Nox_
Profil *
Ještě mě zajímá, může dojít ke kartézkému součinu nejen při provádění dotazu, ale i při vkládání?
Na podobný problém jsem jednou narazil a nedokázal jsem si vysvetlit co to způsobuje...
Kajman_
Profil *
Takže způsob jak se vyhnou kartézskému součinu je používat spojení tabulek?

Spojování tabulek je vždy kartézký součin. Podmínkami ale určujete pravidla a pokud máte podmínky 1:1 nebo 1:0 nemělo by se to projevit násobením počtu řádku.

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