MySQL Запрос в одной и той же таблице в разных столбцах - PullRequest
0 голосов
/ 09 июля 2020

У меня есть две таблицы: 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

Спасибо за помощь!

1 Ответ

0 голосов
/ 09 июля 2020

Это должно сработать.

SELECT      p.name, p.id
FROM        ProjectFieldValue pfv
LEFT JOIN   Project p
    ON      pfv.project_id = p.id
WHERE       (field_key = 'contract_status' AND pfv.text_value = 'Active')
    OR      (field_key = 'contract_client_type' AND pfv.text_value = 'Seller')
    OR      (pfv.field_key = 'listing_date' AND pfv.date_value between '2020-07-08 00:00:00' AND '2020-07-11 23:59:59')
GROUP BY    p.id;

Но я сомневаюсь, почему вы остались присоединиться к Project и ProjectFieldValue. Простое внутреннее соединение должно решить вашу задачу. Поскольку вы группируете по p.id. Вы можете поощрять использование большого количества столбцов с нулевым значением. Поэтому я бы предложил ниже.

SELECT      p.name, p.id
FROM        Project p
JOIN        ProjectFieldValue pfv
    ON      p.id = pfv.project_id
WHERE       (field_key = 'contract_status' AND pfv.text_value = 'Active')
    OR      (field_key = 'contract_client_type' AND pfv.text_value = 'Seller')
    OR      (pfv.field_key = 'listing_date' AND pfv.date_value between '2020-07-08 00:00:00' AND '2020-07-11 23:59:59')
GROUP BY    p.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...