У меня есть таблица person, которая выглядит следующим образом:
Persons
id | name
1 | Alex
2 | Jack
3 | Roy
У меня есть другая таблица
Свойства
id | title | format
1 | Age | number
2 | Plays Football | checkbox
3 | Weight | number
Персоны и Свойства имеют отношение многие ко многим через третью таблицу PersonProperties.
PersonProperties
PersonId | PropertyId | value
1 | 1 | 24
1 | 2 | true
2 | 1 | 43
Я хочу отфильтровать лиц в возрасте от 20 до 30 лет и играет в футбол. Поскольку у меня уже есть идентификаторы Age и Plays Football, их значения равны id 1 (min = 20, max = 30) и id 2 (true). Чтобы получить такой запрос,
SELECT `Persons`.`id`,`name` FROM `Persons`
INNER JOIN `PersonProperties` ON `Persons`.id = `PersonProperties`.`PersonId`
WHERE ((`PersonProperties`.`value` >= 20 AND `PersonProperties`.`value` <= 30) AND `PersonProperties`.`PropertyId` = 1)
AND (`PersonProperties`.`value` = true AND `PersonProperties`.`PropertyId` = 2)
GROUP BY `Persons`.`id`
Возвращает пустой результат.
Желаемый результат
id | name
1 | Alex