Объединить строки с разными значениями столбцов - PullRequest
0 голосов
/ 15 октября 2018

Я делаю поисковик с возможностью использования фильтров.

Мой SQL выглядит так:

SELECT l.location_id, og.*,f.*
        FROM object_types ot
        LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id
        LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_group_type_id
        LEFT JOIN object_groups2filters og2f ON og2f.object_group_id = og.object_group_id
        LEFT JOIN filters f ON f.filter_id = og2f.filter_id
        LEFT JOIN locations l ON l.location_id = og.location_id
        WHERE ot.object_type_key = 'TYPE_TENNIS';

Теперь, основываясь на входных данных фильтра пользователей, я хочу выбрать для него правильное местоположение.Но поскольку я соединяю все с помощью LEFT JOIN, я получаю все элементы фильтра в разных строках, см. Рисунок.

enter image description here

Поэтому я хочу выбратьместоположение, где location_id имеет и filter_key FILTER_GRASS, и FILTER_PARKING.

Если я использую "AND f.filter_key = 'FILTER_PARKING' И f.filter_key = 'FILTER_GRASS'", это не будет работать, потому что значения фильтра находятся в отдельностиряды.

Кто-нибудь имеет подсказку, чтобы выбрать местоположение, где location_id имеет оба filter_keys?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

вы можете попробовать, как показано ниже, используя in и агрегирование условий

    SELECT l.location_id 
    FROM object_types ot
    LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id
    LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_group_type_id
    LEFT JOIN object_groups2filters og2f ON og2f.object_group_id = og.object_group_id
    LEFT JOIN filters f ON f.filter_id = og2f.filter_id
    LEFT JOIN locations l ON l.location_id = og.location_id
    WHERE ot.object_type_key = 'TYPE_TENNIS'
   and f.filter_key in ('FILTER_PARKING','FILTER_GRAS')
    GROUP BY l.location_id 
    HAVING SUM(case when f.filter_key = 'FILTER_PARKING' then 1 else 0 end)>=1 AND 
           SUM(case whenf.filter_key = 'FILTER_GRAS' then 1 else 0 end)>=1
0 голосов
/ 15 октября 2018

Вам нужно использовать Group By с Having для фильтрации местоположений.

Попробуйте:

SELECT l.location_id 
FROM object_types ot
LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id
LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_group_type_id
LEFT JOIN object_groups2filters og2f ON og2f.object_group_id = og.object_group_id
LEFT JOIN filters f ON f.filter_id = og2f.filter_id
LEFT JOIN locations l ON l.location_id = og.location_id
WHERE ot.object_type_key = 'TYPE_TENNIS'
GROUP BY l.location_id 
HAVING SUM(f.filter_key = 'FILTER_PARKING') AND 
       SUM(f.filter_key = 'FILTER_GRASS')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...