[ Bokacio @ 10.02.2010. 11:52 ] @
Pozdrav,

Resio sam da posle dugog vremena predjem sa verzije 4 MySQL servera na verziju 5.

Koliko sam mogao da primetim, prilikom INSERT, CREATE i prostih SELECT upita nema problema sa kompatibilnoscu.

Medjutim, kod kompleksnijih upita sa LEFT JOIN komandom imam problema:

Code:
SELECT
events.importance,
events.color,
events.id,
events.event_type_id,
events.date_time,
event_types.name,
events.description,
events.document_info,
employees.display,
records.name,
users.name
FROM events, changes, objects
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id
WHERE events.id = changes.event_id
AND events.record_id = 1
AND objects.locked = "false"
GROUP BY events.id
ORDER BY events.date_time DESC


Ovaj upit koji lepo radi u 4.x verziji, daje gresku Unknown column 'events.record_id' in 'on clausule' u verziji 5.x servera.

Da li sam nesto propustio, ili da li treba da na nesto obratim paznju prilikom koriscenja LEFT JOIN u v5.x servera?

Hvala najlepse
[ bogdan.kecman @ 10.02.2010. 12:12 ] @
da .. 4.x nije postovao sql standard, 5.x ga postuje tako da sada taj upit ne radi ...

pogledaj po redu:

http://dev.mysql.com/doc/refman/4.1/en/upgrade.html
http://dev.mysql.com/doc/refman/5.0/en/upgrade.html
http://dev.mysql.com/doc/refman/5.1/en/upgrade.html

ima raznih nekompatibilnosti ... tako da moras da prodjes kroz te strane (ako radis upgrade radi ili na 5.1 ili na 5.5 posto je 5.0 sada u extended supportu sto znaci da za njega nema daljeg razvijanja/ 5.1 je trenutni GA a 5.5 je trenutna beta pa odluci sam .. ja drzim svoje sajtove sve na 5.5 ali nije bas bug free jos uvek tako da ga ne predlazem za production, 5.1 je skroz ok)

[ Bokacio @ 10.02.2010. 12:28 ] @
Hvala Bogdane,

Da li mozda znas (na prvi pogled) sta ne valja kod mog upita. Nije mi jasna greska uopste.

Inace koristim v5.1 servera.

Upravo citam stranice sa linkova koje si mi poslao.

Pozdrav
[ bogdan.kecman @ 10.02.2010. 13:06 ] @
pogledaj tvoj kod

Code:

FROM events, changes, objects
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id


to je

Code:

FROM events 
INNER JOIN changes
INNER JOIN objects
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id


kako LEFT JOIN ima prioritet nad INNER JOIN to je onda

Code:

FROM events 
INNER JOIN changes
INNER JOIN
(
objects
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id
)


kao sto vidis u zagradi nema tabele events te events.record_id ne postoji ... promeni upit da bude

Code:

FROM changes, objects, events
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id


i sve ce da radi :)
[ Bokacio @ 10.02.2010. 13:54 ] @
Hvala Bogdane,

Sada radi.

Zanima me samo zasto se ova tabela objects "pretvara" u ovo:

Code:

INNER JOIN
(
objects
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id
)


Nije mi jasno zasto i sta znaci sto je on LEFT JOIN stavio unutar zagrada od INNER JOIN.

Hvala na pojasnjenju. Postoji li na netu neki dobar tutorijal koji ce mi ovo objasniti.

Pozdrav!
[ bogdan.kecman @ 10.02.2010. 14:07 ] @
Citat:

Zanima me samo zasto se ova tabela objects "pretvara" u ovo:


izgleda nisam napisao dovoljno jasno .. sorry ...

Code:

... from a,b,c,d ...


je isto sto i

Code:

... from a inner join b inner join c inner join d ...


to je samo razlicita sintaksa ...

e sada ... kao sto je
Code:

a+b+c+d*e*f


isto sto i

Code:

a+b+c+(d*e*f)


zato sto je prioritet operacije * veci nad prioritetom operacije +

tako i posto je prioritet LEFT join veci od prioriteta INNER join

Code:

... from a inner join b inner join c left join d left join e


mozemo napisati i kao

Code:

... from a inner join b inner join (c left join d left join e)


dakle samo je rec o prioritetu operatora ... te kao sto * ima veci prioritet od + tako left join ima veci prioritet od inner join.

[Ovu poruku je menjao bogdan.kecman dana 10.02.2010. u 15:33 GMT+1]
[ bogdan.kecman @ 10.02.2010. 14:35 ] @
sto se tutorijala tice ... "nemam pojma" :D ..
[ Bokacio @ 10.02.2010. 14:36 ] @
Hvala jos jednom,

Meni jedino ne ide u glavu zasto su dodate zagrade u ovom slucaju:

FROM events
INNER JOIN changes
INNER JOIN
(
objects
LEFT JOIN records on events.record_id = records.id
LEFT JOIN event_types on events.event_type_id = event_types.id
LEFT JOIN employees on events.employee_id = employees.id
LEFT JOIN users on events.user_id = users.id
)

Kako ova tabela objects utice na ove LEFT JOIN-e? I zasto smo premestanjem tabele events uspeli da pokrenemo upit.

Hvala!
[ bogdan.kecman @ 10.02.2010. 15:06 ] @
Citat:

Meni jedino ne ide u glavu zasto su dodate zagrade u ovom slucaju:


nisu "dodate" zagrade ... left ima veci prioritet od inner .. dakle kao * u odnosu na + ... to je kao da me pitas zasto je

Code:

a+b+c+(d*e*f)


ne moras da napises te zagrade, one se podrazumevaju posto * ima veci prioritet .. tako i ovde ... LEFT ima veci prioritet

stvarno ne umem da ti objasnim jednostavnije .. to se uci iz matematike u prvih par razreda osnovne skole .. odma posle tablice mnozenja ..
[ Bokacio @ 10.02.2010. 15:31 ] @
Hvala jos jednom,

Nije trebala ona recenica sa tablicom mnozenja, ali ok :)

Hvala jos jednom
[ bogdan.kecman @ 10.02.2010. 15:41 ] @
nisam mislio nista lose time ... samo kazem da ne umem ja jednostavnije da objasnim .. (prosveta mi nije jaca strana) ..
[ Bokacio @ 10.02.2010. 15:45 ] @
Ok je,

Razumem taj deo oko prvenstva, bavim se programiranjem skoro 20 godina, ali mi samo nije jasno odakle objects unutar zagrada, a ne izvan. Moje znanje o LEFT JOINU se baziralo na verziji 4.1 mysql-a koje je izgleda bilo pogresno pa mi je tesko da sada promenim nacin razmisljanja sto se tice MySQL v5.
[ bogdan.kecman @ 10.02.2010. 16:02 ] @
Citat:
Bokacioali mi samo nije jasno odakle objects unutar zagrada, a ne izvan


pa zato sto LEFT ima prvenstvo. objects ima 2 operatora, sa jedne strane INNER sa druge strane LEFT, kako LEFT ima veci prioritet objects ide unutar a ne izvan zagrade

Citat:
Moje znanje o LEFT JOINU se baziralo na verziji 4.1 mysql


na 4.1 je optimizer
- imao istio prioritet za left i inner
- pogadjao stvari

i jedno i drugo je moralo da se izmeni zbog standarda ...

ovo sto je bio isti prioritet, to je ovo sto te sad pogodilo ... ono sto je "pogadjao" to znaci da je radilo ovo:

Code:

create table t1 (id int, a int);
create table t2 (id int, b int);
select * from t1 join t2 on a=b;


ma koliko je a sigurno iz t1 i b sigurno iz t2 posto ne postoji drugo a i drugo b i u tom slucaju je 4.1 nalazio sam "sta si mislio" ... a cak i ovo je radilo
Code:

create table t1 (id int, a int, b int);
create table t2 (id int, a int);
select * from t1 join t2 on a=b;


ma koliko je ovo potpuna glupost od upita, ovo bi u 4.x radilo i myusql bi "po nekoj logici" odabrao odakle ce da uzme a a odakle b ..

za ovo, 5.x kaze da je ambiguous i da nema pojma "sta si ti mislio sa a" i zahteva da to bude "on t1.b=t2.a" te nikakvo "pogadjanje" vise ne dolazi u obzir.