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
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
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
děkuji za vysvětlení

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:

0