MySQL query problem

2 отговора 89 прегледа
#1

MySQL query problem

Zdraveite

imam problem sys slednata situacia:
tFirma - tablica za firmite
FirmaID

tOtdel - tablica za otdelite
OtdelID
frFirmaID

tSlujitel - tablica za rabotnicite
SlujitelID
frFirmaID
frOtdelID

Za slujitelite ne e zadyljitelno da prinadlejat kym otdel, zatova e i poleto frFirmaID.
Opitvam sys:

1. Select f.FirmaID, o.OtdelID, s.SlujitelID
2. from tFirma f
3. left join tOtdel o on o.frFirmaID = f.FirmaID
4. left join tSlujitel s on s.frFirmaID = f.FirmaID and s.frOtdelID = o.OtdelID
5. where f.FirmaID = 1

tazi zaiavka mi vryshta vsichki firmi, otdeli i slujiteli (koito sa kym otdeli)
Vyzmojno li e da polucha i slujitelite, koito ne sa kym otdeli?
Ako mahna uslovieto "... and s.frOtdelID = o.OtdelID" na red 4, poluchavam
dublirane na slujitelite (imashe si termin za tova svyrzvane, ama kak beshe... :))

Mersi predvaritelno

Отговор
в отговор на Logo #2

Re: MySQL query problem

Hmm, opitai tova:
1. Select f.FirmaID, o.OtdelID, s.SlujitelID
2. from tFirma f
3. left join tOtdel o on o.frFirmaID = f.FirmaID
4. left join tSlujitel s on s.frFirmaID = f.FirmaID and (s.frOtdelID = o.OtdelID or s.frOtdelId is null)
5. where f.FirmaID = 1

Не съм сигурен дали горното ще ти работи, ако не - махни условието s.frOtdelID = o.OtdelID и опитай да избегнеш дублирането с distinct f.FirmaID, o.OtdelID, s.SlujitelID или group by s.SlujitelID

Това беше по отношение на заявката ти... по отношение на структурата, имаш излишество на данни в tSlujitel, както сам си усетил - в повечето случаи frFirmaID ти е функция на frOtdelID. Вярно, че си обяснил защо така ти се налага, но според мен по-добро решение ще е да си направиш един dummy отдел за всяка фирма в tOdtel, към който да слагаш тези служители, които не принадлежат към никой отдел

Отговор
в отговор на Logo #3

на прав път си

правилно ползваш outer join -- но щом искаш всички служители (независимо дали са в отдел или не), таблицата служител трябва да е първа в джоина.

Отговор