Autor Zpráva
enoice
Profil
Ahoj,

v MySQL mam tri tabulky: kraje, mesta, objekty.

kraje: id, jmeno
mesta: id, jmeno, idkraje
objekty: id, jmeno, idmesta

v SQL nejsem příliš zběhlej, takže to snad nebude tak složitý.

Tedy, potřebuju vypsat všechny objekty z daného kraje... čili kde objekty.idmesta = mesta.id a kraje.id = mesta.idkraje

Díky
Casero
Profil
enoice
něco jako
select sloupce from objekty o left join mesta m on o.idmesta=m.id left join kraje k on k.id=m.idkraje where k.jmeno=neco
MzM
Profil
myslím, že v tomto případě je potřeba použít join místo left join, nebo jinak poskládat tabulky (první tu s krajem), enoice chce seznam objektů z kraje ne všechny objekty.
Jinak se selectem souhlasím.
enoice
Profil
se SELECT taky souhlasim :D to join se pouziva jak?

Ja to nějak moc nechápu...

SELECT objekty.* FROM objekty,mesta,kraje WHERE objekty.idmesta = mesta.id AND mesta.idkraje = kraje.id


tak nějak bych to viděl já, ale takhle mi to nefunguje
Ssob
Profil
skus

SELECT objekty.* FROM objekty LEFT JOIN mesta ON mesta.id = objekty.idmesta LEFT JOIN kraje ON kraje.idmesta = mesta.idkraje
MzM
Profil
no, join a left join (možno vidět i jako inner join a left outer join)
join spojí tabulky podle daného kritéria (to je to za "on") a vypíše ty řádky, kde se naskytne shoda. V tomto případě je jedno, jestli spojuju tabulku 1 s tabulkou 2 nebo tabulku 2 s tabulkou 1. Příklad:
tab1:
id | text
----------
1 | aaa
2 | bbb
3 | ccc

tab2:
id | cizi_id | jinytext
-------------------------
1 | 1 | toto
2 | 3 | tamto

provedu join:

select a.text, b.jinytext
from tab1 a
join tab2 b on a.id = b.cizi_id

dostanu
text | jinytext
-----------------
aaa | toto
ccc | tamto

pokud udělám left join

select a.text, b.jinytext
from tab1 a
left join tab2 b on a.id = b.cizi_id

dostanu
text | jinytext
-----------------
aaa | toto
bbb | (null)
ccc | tamto

tedy všechno z první tabulky a připojí text z druhé tabulky, pokud se mu podaří najít odpovídající řádek.

na netu je toho plno.
(dále viz right join, cross join)
Toto téma je uzamčeno. Odpověď nelze zaslat.