Как получить инклюзивный набор результатов без использования PHP? - PullRequest
0 голосов
/ 07 ноября 2011

Хорошо, у меня есть таблица с именем exp_category_posts, которая отвечает за хранение отношений между entry_id и всеми связанными cat_id с, как строки в таблице (один столбец для entry_id,один столбец для cat_id)

Для поискового плагина, который я пишу, пользователь может искать по категориям, и я хочу вернуть все соответствующие записи.

Если я попытаюсь SELECT entry_id FROM exp_category_posts WHERE cat_id = 1 AND cat_id = 2Я ожидаю получить набор записей, которые назначены обеим кошкам, но вместо этого я получаю пустой набор результатов каждый раз.Использование OR не дает желаемого набора результатов.

Единственный найденный мной способ получить желаемые результаты - разбить его на этапы:

Шаг 1: Выполнитезапрос для каждого cat_id.
Шаг 2. Сохранение набора результатов в виде массива.
Шаг 3. Использование нескольких вызовов in_array() для отфильтровывания записей, которые не во всех наборах результатов.

Хотя этот метод работает, он довольно неэффективен.Есть ли способ получить результаты, которые я хочу, с помощью одного запроса вместо того, чтобы делать это таким образом?

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

То, что вы хотите, это пересечение между двумя наборами:

  • entry_id, которые имеют cat_id = 1
  • entry_id, которые имеют cat_id = 2

Вы можете получить это с помощью INNER JOIN примерно так:

SELECT c1.entry_id
FROM
    exp_category_posts AS c1
    INNER JOIN (
        SELECT entry_id
        FROM exp_category_posts
        WHERE cat_id = 2
    ) AS c2
        ON c1.entry_id = c2.entry_id
WHERE c1.cat_id = 1
1 голос
/ 07 ноября 2011
SELECT
    entry_id
FROM
    exp_category_posts
WHERE
    cat_id = 1 OR
    cat_id = 2
GROUP BY
    entry_id
HAVING
    COUNT(*) = 2
...