Oznámení
SQL dotaz – vazební tabulka – není v tabulce
před 6 lety
- Hedgexu
- Člen | 12
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ěď
Editoval Hedgexu (17. 3. 2013 15:33)
před 6 lety
- Hedgexu
- Člen | 12
Milo napsal(a):
Je mi líto. Viz. 1070-temata-netykajici-se-dibi-sem-nepatri
Dibi se to týká, dotazy píšu pomocí dibi, ale tak nejdřív musím vědět co vůbec psát.
Pokud teda se můžu opravit potřebuju dibi dotaz co toto provede.
před 6 lety
- Milo
- Nette Core | 1119
OK, to jsem z prvního příspěvku nepochopil. Jak máš zapsaný ten s uživateli ve skupině?
před 6 lety
- Hedgexu
- Člen | 12
<?php
$query = dibi::select('User.id')
->select('User.username')
->select('Group.id')->as('Group_id')
->select('Group.name')
->from('UserInGroup')
->join('User')->on('User.id = UserInGroup.user_id')
->join('Group')->on('Group.id = UserInGroup.group_id')
->where('Group.id = %i', $group)
->fetchAll();
?>
Našel jsem 1 řešení ovšem je to n + 1 dotazů na databázi, což se mi moc dělat nechce.
<?php
SELECT User.id, User.username
FROM User
WHERE NOT EXISTS (SELECT * FROM UserInGroup WHERE UserInGroup.user_id =
User.id AND UserInGroup.group_id = $group)
?>
Šlo by toto vůbec nějak zapsat v dibi, případně jak pokud nemáte nějaký jiný nápad jak ten dotaz vyřešit?
Editoval Hedgexu (17. 3. 2013 20:57)
před 6 lety
- Milo
- Nette Core | 1119
$subquery = dibi::select('*')->from('UserInGroup')->where('group_id = %i', $idGroup);
dibi::select('User.id, User.username')->from('User')->where('NOT EXISTS %SQL', $subquery);
anebo přes IN operátor, ale u MySQL je/býval nějaký výkonostní problém
$subquery = dibi::select('user_id')->from('UserInGroup')->where('group_id = %i', $idGroup);
dibi::select('User.id, User.username')->from('User')->where('User.id NOT IN %SQL', $subquery);
anebo, pokud MySQL umí
SELECT *
FROM User
LEFT JOIN UserInGroup ON User.id = user_id AND group_id = %i
WHERE user_id IS NULL
Editoval Milo (17. 3. 2013 23:00)