tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

SQL dotaz – vazební tabulka – není v tabulce

před 5 lety

Hedgexu
Člen | 12
+
0
-

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 5 lety

Milo
Moderator | 1031
+
0
-

před 5 lety

Hedgexu
Člen | 12
+
0
-

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 5 lety

Milo
Moderator | 1031
+
0
-

OK, to jsem z prvního příspěvku nepochopil. Jak máš zapsaný ten s uživateli ve skupině?

před 5 lety

Hedgexu
Člen | 12
+
0
-
<?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 5 lety

Milo
Moderator | 1031
+
0
-
$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)