Autor Zpráva
Waren
Profil
Mám následující strukturu databáze:

Room: (id, fixed, #accounts)
RoomAccount: (room_id, account_id)
Account: (id)

V RoomAccount mám následující:
room_id | account_id
1            | 1
1            | 2

Potřebuji vybrat místnost, která je fixní a zároveň obsahuje jak 1, tak i 3. Tento dotaz mi vybere místnost 1:

Doctrine Query Builder
$this->getRepository(Room::class)->createQueryBuilder('e')
            ->where('a.id IN(1, 3)')
            ->innerJoin('e.accounts', 'a');

SQL
SELECT * FROM Room INNER JOIN RoomAccount ON Room.id = RoomAccount.room_id INNER JOIN Account ON Account.id = RoomAccount.account_id WHERE RoomAccount_.id IN ('1', '3') AND Room.fixed = '1'

Předpokládám, že budu asi muset použít subquery, ale lze to i jinak?

Nevím, jak položit dotaz googlu i do nadpisu jsem nevěděl co dát...
Keeehi
Profil
Waren:
Řešením je dvojitý join s tou samou tabulkou, jednou s podmínkou pro 1 podruhé pro 3.

Neškáluje to ale úplně nejlépe. Pokud by těch možností bylo více, byl by to problém. Pokud by platilo, že hodnoty v rámci jednoho pokoje jsou unikátní, dala by se použít subquery select id_room from rooms where account_id IN (1,3,5,14) group by room_id having count(*) = 4.
Kajman
Profil
Keeehi:
Pokud by platilo, že hodnoty v rámci jednoho pokoje jsou unikátní

Neunikátnost lze ošetřit díky distinct v countu
having count(distinct account_id) = 4
FAQ
Waren
Profil
Keeehi: Děkuju

Kajman: FAQ sekce jsem si nevšiml, děkuju

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:

0