Autor Zpráva
ananasovapasta
Profil *
Ahoj, mohli byste mi prosím pomoct s tímhle problémem , potřeboval bych nejak sestavit tyto dva dotazy :

vyber všechny zaměstnance, kteří mají všechny oddělení aktivní

vyber všechny zaměstnance, pro něž není žádné oddělení aktivní

přičemž tabulka zaměstnanců obsahuje ID zaměstnance a jméno a tabulka oddělení obsahuje ID zaměstnance a oddělení ( zaměstnanec může pracovat na více odděleních současně)

Předem moc děkuji za pomoc, postačil by aspon nástin řešení tohoto problému :)

Díky
123456789
Profil *
Jestli může zaměstnanec pracovat na více odděleních současně, tak máš špatnou strukturu databáze. To proto, že v případě zaměstnance, který pracuje na více odděleních budeš mít zbytečně duplicitní záznamy v tabulce oddeleni (dané oddeleni se bude opakovat tolikrát, kolik zaměstnanců v něm bude pracovat). Tady by měl být vztah M:N a ne 1:N jak to máš nyní ty.

"vyber všechny zaměstnance, kteří mají všechny oddělení aktivní"
"vyber všechny zaměstnance, pro něž není žádné oddělení aktivní"

Nevidím tam žádný atribut, který by určoval, zda-li je daný zaměstnanec v daném oddělení aktivní.

Takže prosím doplň informace a popřemýšlej o lepším návrhu, takhle s tím budeš mít akorát problémy.
Nox
Profil
jestli to chápu dobře, tak - v klauzuli WHERE použij IN případně NOT IN a za tím poddotaz do datbulky oddělení
123456789
Profil *
EDIT: Pokud by zaměstnanec mohl pracovat nejvýše v jednou oddělení, tak by potřeboval být v tabulce Zamestnanci cizí klíč do tabulky Oddeleni. To co máš ty vystihuje dobře situaci, kdy v daném oddělení může pracovat nejvýše jeden zaměstnanec a jeden zaměstnanec může pracovat současně ve více různých odděleních. Ale takové oddělení s nejvýše jedním zaměstnancem (navíc každé oddělení s nejvýše jedním zaměstnancem) asi moc obvyklé nebude...
ananasovapasta
Profil *
123456789:
Nevidím tam žádný atribut, který by určoval, zda-li je daný zaměstnanec v daném oddělení aktivní.
>
Takže prosím doplň informace a popřemýšlej o lepším návrhu, takhle s tím budeš mít akorát problémy.

Dobre, pro priklad jsem to zjednodusil ,ale zapomnel sem uvest ze v tabulce oddeleni je jeste sloupec 'active'



Nox:
jestli to chápu dobře, tak - v klauzuli WHERE použij IN případně NOT IN a za tím poddotaz do datbulky oddělení

Mohl bys prosím uvést nějaký příklad takového dotazu ? díky :)



123456789:
Pokud by zaměstnanec mohl pracovat nejvýše v jednou oddělení, tak by...

Zaměstnanec může být evidován v mnoha odděleních

Moderátor Joker: Sloučil jsem tři příspěvky zaslané v rozmezí dvou minut do jednoho
Joker
Profil
ananasovapasta:
Předpokládám:
1. O oddělení potřebujete evidovat více informací, než jen ID oddělení?
2. Oddělení asi může mít více než jednoho zaměstnance.
3. Chcete, aby i zaměstnanec mohl mít více než jedno oddělení.
=> Je to vztah M:N a chtělo by to tři tabulky:
- tabulka s informacemi o odděleních
- tabulka s informacemi o zaměstnancích
- vazební tabulka ID oddělení - ID zaměstnance

Dál už už si nejsem jistý:
"vyber všechny zaměstnance, kteří mají všechny oddělení aktivní"
"vyber všechny zaměstnance, pro něž není žádné oddělení aktivní"
Co přesně znamená "aktivní"? Znamená "neaktivní", že zaměstnanec v tom oddělení nepracuje (neboli je to existence/neexistence vztahu mezi zaměstnancem a oddělením), nebo zaměstnanec může být součástí oddělení, které je "neaktivní" (neboli "aktivní"/"neaktivní" je vlastnost oddělení)?
Nebo může jeden zaměstnanec být "neaktivní" člen nějakého oddělení, zatímco jiný zaměstnanec být "aktivní" člen daného oddělení (neboli "aktivní"/"neaktivní" je vlastnost vztahu mezi zaměstnancem a oddělením)?
V prvním případě by to "aktivní" reprezentovala přítomnost nebo nepřítomnost záznamu ve vazební tabulce. Druhý případ by měl být reprezentovaný sloupcem v tabulce oddělení. Třetí případ by měl být reprezentovaný sloupcem ve vazební tabulce.
Kajman_
Profil *
vyber všechny zaměstnance, kteří mají všechny oddělení aktivní

select z.* from oddeleni o left join zam2odd zo on o.idoddeleni=zo.idoddeleni and zo.aktivni=1
left join zamestnanci z on zo.id_zamestnance=z.id_zamestnance
group by z.id_zamestnance
having count(o.idoddeleni)=count(z.id_zamestnancce)


vyber všechny zaměstnance, pro něž není žádné oddělení aktivní

select z.* from zamestnanci left join  zam2odd zo on zo.aktivni=1 and zo.id_zamestnance=z.id_zamestnance
where zo.id_zamestnance is null
ananasovapasta
Profil *
díky :) nějak jsem se s tím popral :)

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: