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)
Tabulka děti: (child_info)
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.
Řekl bych, že ani nemůže ... není pro ně splněna podmínka u AND.
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ód.
A ideálně prázdné třídy na konci "seznamu".
To by bylo supr.
Asi to není dobře navržené ... udělal bych tabulky:
místnosti
třídy (5.A, 5.B, atd.)
žáci
nebo asi lépe:
místnosti
třídy
ročníky
žáci
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)
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.
Dítě může být v několika třídách zároveň?
Ne
Tak pak se nemuze dite zobrazovat vickrat.
Tobe se to násobí, protoze mas blbe podminku pro napojeni tabulek.
Ten muj dotaz nefunguje? Hlavne se podivej na join podminku
Máš pravdu už to jede.
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...