Autor Zpráva
Hedgexu
Profil
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
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)
anebo
SELECT u.id, u.`username`
FROM User u
INNER JOIN UserInGroup ug ON u.id = ug.user_id
WHERE ug.group_id != $idSkupiny
První vybere i uživatele, kteří nejsou v žádné skupině. Druhý jen uživatele, kteří jsou (také) v jiné skupině (tj. kvůli INNER JOIN nenajde uživatele bez skupiny).
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)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0