Autor | Zpráva | ||
---|---|---|---|
Hedgexu Profil |
#1 · Zasláno: 17. 3. 2013, 16:26:28
Dobrý den.
Při programování jsem narazil na žádost do databáze, kterou nevím jak napsat ani jako SQL příkaz. Mám tabulky: User (id, username, field_id, year_id) Group (id, name, field_id, year_id) vazební tabulka – UserInGroup (user_id, group_id) Field (id, code, name) Year (id, year) (vše končící _id je ukazatel do jiné tabulky) Pokud chci vybrat uživatele, kteří jsou ve skupině je to jednoduché: `SELECT User.id, User.username, Group.id AS Group_id, Group.name FROM UserInGroup JOIN User on User.id = UserInGroup.user_id JOIN Group on Group.id = UserInGroup.group_id WHERE Group.id = INT;` Problém je, že jako další příkaz potřebuji vybrat uživatele, kteří nejsou v danné skupině. Pokud máte lepší dotaz pro ty, kteří ve skupině jsou také jej prosím napište. Jedná se o můj první projekt. Děkuji za opověď |
||
Tori Profil |
#2 · Zasláno: 17. 3. 2013, 16:34:12
SELECT u.id, u.`username` FROM User u WHERE NOT EXISTS (SELECT * FROM UserInGroup ug WHERE ug.user_id = u.id AND ug.group_id = $idSkupiny) SELECT u.id, u.`username` FROM User u INNER JOIN UserInGroup ug ON u.id = ug.user_id WHERE ug.group_id != $idSkupiny |
||
Hedgexu Profil |
Tori:
> SELECT u.id, u.`username` > FROM User u > WHERE NOT EXISTS (SELECT * FROM UserInGroup ug WHERE ug.user_id = u.id AND ug.group_id = $idSkupiny) Dělá přesně to co jsem potřebova potřeboval. Děkuji. Ovšem není toto tzv. 1+n dotazů na databázi aneb pro každého uživatele se databáze aplikace dotazuje serveru? |
||
Tori Profil |
Hedgexu:
Nevšimla jsem si editace, pardon. „není toto tzv. 1+n dotazů na databázi aneb pro každého uživatele se databáze aplikace dotazuje serveru?“ Jestli si aplikace načte všechny skupiny a pak ke každé zvlášť dohledává nepřiřazené uživatele, tak nejspíš ano. SQL dotaz samotný s tím ale nemá co společného, spíš logika aplikace a/nebo použitá DB vrstva. Jestli obě skupiny výsledků potřebujete na stejné stránce, šlo by to vytáhnout obojí dohromady, tj. všichni uživatelé a k nim 1 nebo 0, jestli jsou v zadané skupině: left join, podmínka na skupinu do ON, $isPresent = (count > 0)
|
||
Časová prodleva: 11 let
|
0