Autor Zpráva
pema01
Profil
Ahoj,

již dlouho přemýšlím nad asi trochu složitějším SQL příkazem a ne a ne s tím hnout. Mám 3 tabulky (jejich strukturu vidíte na obrázku zde:).
Potřebuji vypsat výsledek příkazu: Vypiš všechny řádky z tabulky TSubject (všechny předměty v tabulce), které nemají v tabulce TSchoolSubject přiřazenou hodnotu školy uloženou v proměnné v PHP (TSchool.ID). Zkrátka chci vypsat všechny předměty, které škola nemá přiřazené v zásobníku TSchoolSubject, jestli mi rozumíte.

Jsem v mysql začátečník a s tímto si nějak nedokážu poradit.

Díky
midlan
Profil
Jestli chápu, hledáš předměty, které nejsou přiřazeny žádné škole. Potom taktko:

SELECT * FROM TSubject s WHERE s.ID NOT IN (SELECT ss.IDSubject FROM TSchoolSubject ss);

Tento dotaz by to měl řešit za předpokladu, že máš správně zavedený cizí klíč na tu školu.

BTW: potřebuješ v tabulce TSchoolSubject nutně to ID? Zrušil bych ho a zavedl kompozitní primární klíč nad IDSubject a IDSchool. Případně jestli je ID potřeba, měl bys mít zavedený popsaným způsobem klíč unikátní.
pema01
Profil
midlan:
Ano, u všech tabulek je ID "Primary key" (na obr. jsem zapomněl znázornit).

V databázi je více škol pod různým ID. Přihlášený konkrétní správce školy bude chtít přidat předmět, který je v databázi webu, avšak v jeho škole ještě není zadaný. Proto chci zobrazit všechny předměty, které do školy nepatří (tj. předmět, který škola s ID 1 nemá přiřazený v zásobníku).
Děkuji za radu, zkusím si s tím nějak poradit ;)
pema01
Profil
tak jsem se (marně) pokoušel o nějaký výsledek, ale opravdu jen marně... nejde mi to :-(

"SELECT * FROM `TSubject` WHERE `TSubject.ID` NOT IN "
        . "(SELECT `IDSubject` FROM `TSchoolSubject` WHERE `IDSchool`= '".$_SESSION["IDSchool"]."')"

Tento kód nefunguje, ale nemyslím si, že by byl úplně špatně, co vy na to?
juriad
Profil
pema01:
Když neumíš použivat zpětné apostrofy `, tak je nepoužívej. Jsou nutné jen tehdy, kdyby název tabulky nebo sloupce bylo klíčové slovo v MySQL.
V tvém případě dělá problém `TSubject.ID` - to jsi vynutil, že bude brát celé jako název sloupce, ale takový neexistuje. Správně by to bylo: `TSubject`.`ID` nebo prostě jen TSubject.ID.

Pokud ti něco nefunguje, vypiš si chybu pomoci mysql_error (nebo jiné funkce, podle toho, jakou knihovnu používáš).
pema01
Profil
juriad:
no, koukám, že ty apostrofy nějak zlobí.


"SELECT * FROM TSubject WHERE TSubject.ID NOT IN "
        . "(SELECT IDSubject FROM TSchoolSubject WHERE IDSchool= '".$_SESSION["IDSchool"]."')"

Bez apostrofů tedy kód už krásně funguje. Díky.
mimochodec
Profil
pema01:
Bez apostrofů tedy kód už krásně funguje. Díky.

Zruš ještě tyhle: WHERE IDSchool= '".$_SESSION["IDSchool"]."'
Tam, kde se pracuje s číslem, nemá apostrof co dělat.

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: