У меня есть две таблицы: Project и ProjectFieldValue
Мне нужно вернуть результаты из ProjectFieldValue на основе нескольких различных параметров ключа / значения в таблице. Я могу заставить его работать с одной парой ключ / значение, но как только я добавлю к запросу еще один оператор AND, он ничего не вернет.
Вот образец моих таблиц, за которыми следует мой запрос ...
Таблица проектов
----------------------
id | name
----------------------
1 | Project #1
Таблица ProjectFieldValue
У меня есть миллионы таких записей, и все они хранятся в этой таблице и связанный с конкретным c Project.
----------------------------------------------------------------------------------------
id | project_id | text_value | date_value | field_key
----------------------------------------------------------------------------------------
1 | 1 | Active | NULL | contract_status
2 | 1 | NULL | 2020-06-02 00:01:58 | listing_date
3 | 1 | Seller | NULL | contract_client_type
4 | 1 | Active | NULL | contract_option
Вот мои запросы, разбитые по тому, что работает, а что не работает:
Это работает, но , выполняется поиск по 1 паре ключ / значение ...
SELECT p.name, p.id
FROM ProjectFieldValue pfv
LEFT JOIN Project p
ON pfv.project_id = p.id
WHERE (pfv.text_value IN ( SELECT text_value FROM ProjectFieldValue WHERE text_value IN ('Active')) AND field_key = 'contract_status')
GROUP BY p.id
Это не работает, поскольку выполняется поиск по 3 парам ключ / значение ...
SELECT p.name, p.id
FROM ProjectFieldValue pfv
LEFT JOIN Project p
ON pfv.project_id = p.id
WHERE (pfv.text_value IN ( SELECT text_value FROM ProjectFieldValue WHERE text_value IN ('Active')) AND field_key = 'contract_status')
AND (pfv.text_value IN ( SELECT text_value FROM ProjectFieldValue WHERE text_value IN ('Seller')) AND field_key = 'contract_client_type')
AND (pfv.date_value between '2020-07-08 00:00:00' AND '2020-07-11 23:59:59' AND pfv.field_key = 'listing_date')
GROUP BY p.id
Цель
В конечном счете, мне нужно будет выполнять поиск по неограниченным парам ключ / значение в этой таблице и возвращать все результаты, сгруппированные по p.id
Спасибо за помощь!