Er is een spel genaamd Mega Man in de database welke een many to many relatie heeft met genres. Dit spel heeft (o.a.) de genre avontuur welke gelijk is aan de genre met id 18.
Ik probeer een negatieve filter te maken waarbij gezocht kan worden op de titel van het spel in combinatie met de genre. Alleen komt hier altijd het spel naar voren terwijl ik dit niet verwacht.
Inmiddels een aantal variaties verder met allen hetzelfde resultaat:
Bij een positieve filter (dus WHERE IN() ipv WHERE NOT IN()) werkt dit perfect, maar op moment dat de NOT IN gebruikt wordt, krijg ik alsnog het spel terug alsof dit gelijk staat aan de IN variant.
Gebruik ik bijv. een IN met een genre id welke niet bestaat komt er, zoals verwacht, geen resultaat:
Iemand enig idee waarom de NOT IN variant alsnog resultaat terug geeft?
Dit is de SQL wat ik probeer te bereiken:
Ik probeer een negatieve filter te maken waarbij gezocht kan worden op de titel van het spel in combinatie met de genre. Alleen komt hier altijd het spel naar voren terwijl ik dit niet verwacht.
Inmiddels een aantal variaties verder met allen hetzelfde resultaat:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| $queryBuilder = $this->createQueryBuilder('game'); //Variatie 1 $queryBuilder ->leftJoin('game.genres', 'genre', 'WITH') ->andWhere($queryBuilder->expr()->like('game.title', ':title')) ->andWhere('genre NOT IN(18)') ->setParameter('title', '%Mega Man%'); //Variatie 2 $queryBuilder ->leftJoin('game.genres', 'genre', 'WITH') ->andWhere($queryBuilder->expr()->like('game.title', ':title')) ->andWhere($queryBuilder->expr()->notIn('genre', [18])) ->setParameter('title', '%Mega Man%'); //Variatie 3 $queryBuilder ->leftJoin('game.genres', 'genre', 'WITH', 'genre NOT IN(:genres)') ->andWhere($queryBuilder->expr()->like('game.title', ':title')) ->andWhere($queryBuilder->expr()->notIn('genre', [18])) ->setParameter('title', '%Mega Man%') ->setParameter('genres', [18]); //Hier komt altijd het spel Mega Man terug, terwijl ik juist geen resultaten verwacht. |
Bij een positieve filter (dus WHERE IN() ipv WHERE NOT IN()) werkt dit perfect, maar op moment dat de NOT IN gebruikt wordt, krijg ik alsnog het spel terug alsof dit gelijk staat aan de IN variant.
Gebruik ik bijv. een IN met een genre id welke niet bestaat komt er, zoals verwacht, geen resultaat:
PHP:
1
2
3
4
5
| $queryBuilder ->leftJoin('game.genres', 'genre', 'WITH') ->andWhere($queryBuilder->expr()->like('game.title', ':title')) ->andWhere('genre IN(9999999)') ->setParameter('title', '%Mega Man%'); |
Iemand enig idee waarom de NOT IN variant alsnog resultaat terug geeft?
Dit is de SQL wat ik probeer te bereiken:
SQL:
1
2
3
4
| SELECT * FROM game WHERE game.title LIKE '%Mega Man%' AND game.id NOT IN( SELECT game_id FROM game_genre WHERE game_genre.genre_id IN(18) ); |
[ Voor 20% gewijzigd door ZeroXT op 13-11-2021 22:22 ]