SQL с подзапросами, эффективный способ - PullRequest
2 голосов
/ 25 апреля 2020

Есть ли лучший способ получить отличный результат page_id с условием, где

value_id = 1 and filter_id = 2
and
value_id = 25 and filter_id = 3
and
value_id = 144 and filter_id = 443

, вместо создания подзапросов, таких как:

SELECT
    page_id
FROM
    filter_page_value
WHERE
    value_id = 144
    AND
    filter_id = 443
    AND
    page_id IN
    (
        SELECT
            page_id
        FROM
            filter_page_value
        WHERE
            value_id = 1
            AND
            filter_id = 2
            AND
            page_id IN
            (
                SELECT
                    page_id
                FROM
                    filter_page_value
                WHERE
                    value_id = 25
                    AND
                    filter_id = 3
            )
    )

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

+---------+----------+-----------+
| page_id | value_id | filter_id |
+---------+----------+-----------+
|    1509 |        1 |         2 |
|    1509 |       25 |         3 |
|    1509 |      144 |       443 |
|    1508 |        1 |         2 |
|    1508 |       25 |         3 |
|    1507 |      484 |       111 |
|    1507 |     1110 |       473 |
+---------+----------+-----------+

1 Ответ

4 голосов
/ 25 апреля 2020

Вы можете COUNT все вхождения пар value_id, filter_id, которые соответствуют желаемым входам ((144, 443),(1, 2), (25, 3)) для каждого значения page_id, и выбирать только те значения, которые соответствуют всем 3:

SELECT page_id
FROM filter_page_value
WHERE (value_id, filter_id) IN ((144, 443), (1, 2), (25, 3))
GROUP BY page_id
HAVING COUNT(*) = 3

Вывод (для ваших данных выборки):

page_id
1509

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...