Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno MySQL - Dvě tabulky jednoduchý dotaz (Query)

Ahoj, už se s tím trápím delší dobu, tak si dovoluji sem položit dotaz.

Nejprve to triviálně popíši.
Mám třídy dětí a v každé třídě mohou, ale nemusí být nějaké děti.
Vše se vytváří dynamicky, s tím problém nemám.

Udělal jsem grafické rozhraní, a mám jen jednu potíž.
Pakliže někdo vytvoří třídu, která neobsahuje (zatím) děti, tak se třída neobjevuje ve výpisu.

Jsou to jen dvě triviální tabulky:

Tabulka tridy: (school_class)
[98803-tabulkatrid-png]

Tabulka děti: (child_info)
[98804-tabulkadeti-png]

Vytvořil jsem konkrétně tento dotaz:

Select *, school_class.class_name skola_trida FROM school_class LEFT JOIN child_info ON school_class.id_school = child_info.id_school_class
WHERE (id_school = 100 AND school_class.platne = 1 AND school_class.class_name = child_info.class_name)
GROUP BY child_info.child_name ORDER BY school_class.id

Vše vypadá skvěle, až na to, že tento dotaz nezobrazuje prázdné třídy.
Což je podstatná chyba.

Děkuji za nápad.

Předmět Autor Datum
Řekl bych, že ani nemůže ... není pro ně splněna podmínka u AND.
dsa 23.07.2024 12:36
dsa
To uznávám. Ale i když dám tu podmínku pryč, tak se stejně nic neděje. Potřebuji konkrétní radu - k…
Flash_Gordon 23.07.2024 12:43
Flash_Gordon
Asi to není dobře navržené ... udělal bych tabulky: místnosti třídy (5.A, 5.B, atd.) žáci nebo asi…
dsa 23.07.2024 12:44
dsa
Další problém bych viděl v GROUP BY. MySQL má takovou zajímavou vlastnost (pro mě je to spíš hrubá c…
Wikan 23.07.2024 12:58
Wikan
Nefunguje ti to, protože jsi dal child_info do group by a navic to mas i ve Where, takze prazdne tri…
Jan Fiala 23.07.2024 12:58
Jan Fiala
Rozumím. Jenže hlavní potíž je potom, jak zobrazovat každé dítě jen 1x. Zkusil jsem: SELECT *, sch…
Flash_Gordon 23.07.2024 13:12
Flash_Gordon
Dítě může být v několika třídách zároveň?
Wikan 23.07.2024 13:20
Wikan
Ne
Flash_Gordon 23.07.2024 13:30
Flash_Gordon
Tak pak se nemuze dite zobrazovat vickrat. Tobe se to násobí, protoze mas blbe podminku pro napojeni…
Jan Fiala 23.07.2024 13:34
Jan Fiala
Máš pravdu už to jede. poslední
Flash_Gordon 23.07.2024 13:41
Flash_Gordon
WTF? To neumis vymodelovat ani trvialni vazbu 1:N a pak se do ni dotazat? Proc mas class_name ve tr…
MaSo 23.07.2024 13:17
MaSo

Další problém bych viděl v GROUP BY. MySQL má takovou zajímavou vlastnost (pro mě je to spíš hrubá chyba), že umožňuje mít SELECTu i sloupce, které nejsou uvedené v GROUP BY či nejsou agregované. To pak vede k neočekávaným výsledkům.
Jinak s tím špatným návrhem databáze souhlasím, dalo mi dost práce se v tom zorientovat. Což u dvou tabulek je na pováženou.

Nefunguje ti to, protože jsi dal child_info do group by a navic to mas i ve Where, takze prazdne tridy tam nebudou
Navazovat to pres class_name je taky hloupe, ale budiz.
Pokud pouzivas Left join, nemuzes to pak omezovat podminkami na konci, protoze ty ti eliminuji prazdne tridy, ale musis dat podminky do napojeni tabulek

Zkus neco takoveho (pripadne chyby si oprav)

Select *, school_class.class_name skola_trida 
  FROM school_class 
  LEFT JOIN child_info ON school_class.id_school = child_info.id_school_class and school_class.class_name = child_info.class_name
  WHERE id_school = 100 AND school_class.platne = 1
  ORDER BY school_class.id

Rozumím.
Jenže hlavní potíž je potom, jak zobrazovat každé dítě jen 1x.

Zkusil jsem:

SELECT *, school_class.class_name skola_trida FROM school_class LEFT JOIN child_info ON school_class.id_school = child_info.id_school_class
WHERE (id_school = 100 AND school_class.platne = 1) GROUP BY school_class.id_school ORDER BY school_class.id

Problém: Nezobrazuje prázdné třídy.

Select *, school_class.class_name skola_trida FROM school_class LEFT JOIN child_info ON school_class.id_school = child_info.id_school_class WHERE (id_school =100 AND school_class.platne = 1) ORDER BY school_class.id

Problém: Duplikuje třídy, dělá bordel na prezentační vrstvě - násobí třídy i členy.

WTF? To neumis vymodelovat ani trvialni vazbu 1:N a pak se do ni dotazat?

Proc mas class_name ve tride i v diteti? Proc tam mas vsechno anglicky a najednou sloupec "platne", ktery je pojmenovany cesky? Snad to nedelas do komercniho softu, protoze tohle je HC...

Zpět do poradny Odpovědět na původní otázku Nahoru