Autor | Zpráva | ||
---|---|---|---|
pema01 Profil |
Ahoj,
již týden se morduji s následujícím příkazem: Chci vybrat z tabulky TUsers všechny uživatele, kteří mají v tabulce TUsersStatus (ve sloupci IDStatus) nastavenou hodnotu 2, ZÁROVEŇ mají v tabulce TUsers (ve sloupci IZOSchool) hodnotu $_SESSION[...] a ZÁROVEŇ `ID` v tabulce TUsers není obsaženo nikde v tabulce TClass (ve sloupci classTeacher). Můj SQL kód vypadá takto: SELECT *, TUsers.ID AS IDUser FROM TUsers JOIN TUsersStatus ON TUsers.ID=TUsersStatus.IDUser JOIN TClass ON IDUser=TClass.classTeacher WHERE IDStatus=2 AND TUsers.IZOSchool='".$_SESSION["..."]."' AND NOT (TClass.classTeacher = TUsers.ID ) ORDER BY firstName Problém je právě v tom AND NOT (TClass.classTeacher = TUsers.ID ) . Když zadám jen AND (...), vypíše mi to správně uživatele, kteří mají v TClass.classTeacher svoje ID. Je nutno podotknout, že ostatní mají řádky v TClass.classTeacher (tedy ty bez hodnoty ID uživatele) hodnotu "NULL". Když ale dám negaci AND NOT (...), nic mi to nevypíše - ale mělo by to vypsat všechny uživatele, kteří splňují všechny ostatní podmínky, kromě toho, že tedy nejsou v TClass.classTeacher.
Mysql nikdy nebylo moje hobby, znám jen základy, a tak omluvte třeba zbytečně dlouhý zápis. Děkuji za radu! |
||
Lonanek Profil |
#2 · Zasláno: 27. 1. 2016, 18:29:10
pema01:
„že ostatní mají řádky v TClass.classTeacher (tedy ty bez hodnoty ID uživatele) hodnotu "NULL"“ A toho také využít. SELECT *, TUsers.ID AS IDUser FROM TUsers JOIN TUsersStatus ON TUsers.ID=TUsersStatus.IDUser JOIN TClass ON IDUser=TClass.classTeacher WHERE IDStatus=2 AND TUsers.IZOSchool='".$_SESSION["..."]."' AND TClass.classTeacher IS NULL ORDER BY firstName |
||
pema01 Profil |
tak jsem to upravil, ale stále to nic nevypisuje, přestože je SQL správně
SELECT *, TUsers.ID AS IDUser FROM TUsers JOIN TUsersStatus ON IDUser=TUsersStatus.IDUser JOIN TClass ON IDUser=TClass.classTeacher WHERE IDStatus=2 AND TUsers.IZOSchool='" . $_SESSION["IZOSchool"] . "' AND TClass.classTeacher IS NULL ORDER BY firstName přikládám diagram struktury |
||
Kajman Profil |
pema01:
Už stačí jen malá změna... tedy použít vnější spojení a ve where nechat tu novou podmínku určující, že se spojení nepodařilo SELECT *, tusers.id AS IDUser FROM tusers JOIN tusersstatus ON tusers.id = tusersstatus.iduser LEFT JOIN tclass ON tusers.id = tclass.classteacher WHERE idstatus = 2 AND tusers.izoschool = '" . $_SESSION["IZOSchool"] . "' AND tclass.classteacher IS NULL ORDER BY firstname |
||
pema01 Profil |
VÝBORNĚ!!! Děkuji moc.
Chci se jen zeptat, kdy mám použít JOIN a kdy LEFT JOIN. Mám totiž další případ tzv. doplňku do množiny. Chci zobrazit všechny řádky MÍNUS ty, které již daný uživatel má - já bych psal opět ...AND NOT (X = Y )... , ale to opět nefunguje. Funkce MINUS není prý v mysql podporována.
Moc jsem nenašel článků na téma doplňků do množiny :-( Dík! tak už jsem to vyřešil pomoci NOT IN
|
||
Kajman Profil |
#6 · Zasláno: 28. 1. 2016, 12:43:18
Left join nezahodí řádky z levé tabulky, pokud se k nim nepodaří najít žádný řádek odpovídající podmínce spojení. Místo hodnot z pravé tabulky pak budou samé null
hodnoty. Viz cs.wikipedia.org/wiki/JOIN#Vn.C4.9Bj.C5.A1.C3.AD_spojov.C3.A1n.C3.AD www.linuxsoft.cz/article.php?id_article=837 Toho se dá využít pro ty negace... zkusíte udělat takové propojení, ale pokud je primární klíč null, tak se žádný odpovídající řádek v druhé tabulce nenašel. Můžete to zapsat i přes not in (v hodně starých verzích mysql to ale nebylo podporováno a ve starých to občas nebylo rychlé). Pro lidi je not in verze lépe čitelná. |
||
pema01 Profil |
#7 · Zasláno: 29. 1. 2016, 12:04:11
děkuji za vysvětlení
|
||
Časová prodleva: 9 let
|
0