Obtendo todas as postagens para um ID de categoria específico que correspondem a determinados parâmetros

Desenvolvi uma consulta SQL que obtém todas as postagens do meu site que contêm certas palavras-chave, mas gostaria de restringir as postagens a um ID de categoria específico. Alguém sabe como fazer isso, dado que (aparentemente) category_id não é um dos campos da tabela “posts”? Aqui está minha consulta (que executei e funciona bem, mas puxa de TODAS as postagens e eu só quero postagens de uma categoria):

-- [params]
-- string_list :first_list_of_keywords
-- null string_list :second_list_of_keywords

WITH FirstFilter AS (
    SELECT *
    FROM posts
    WHERE EXISTS (
        SELECT 1
        FROM UNNEST(ARRAY[:first_list_of_keywords]) AS s(word)
        WHERE POSITION(LOWER(s.word) IN LOWER(posts.raw)) > 0
    )
), SecondFilter AS (
    SELECT *
    FROM posts
    WHERE NOT EXISTS (
        -- Garante que NÃO há palavra-chave faltando no texto da postagem
        SELECT 1
        FROM UNNEST(ARRAY[:second_list_of_keywords]) AS t(word)
        WHERE POSITION(LOWER(t.word) IN LOWER(posts.raw)) = 0
    )
)

SELECT p.*
FROM posts p
INNER JOIN FirstFilter f ON p.id = f.id
INNER JOIN SecondFilter s ON p.id = s.id

Só precisava estender a cláusula WHERE para pesquisar o topic_id na tabela topics, que terá a coluna category_id.

-- [params]
-- int :category_id
-- string_list :first_list_of_keywords
-- null string_list :second_list_of_keywords

WITH FirstFilter AS (
    SELECT *
    FROM posts
    WHERE topic_id IN (
        SELECT id FROM topics WHERE category_id = :category_id
    ) AND EXISTS (
        SELECT 1
        FROM UNNEST(ARRAY[:first_list_of_keywords]) AS s(word)
        WHERE POSITION(LOWER(s.word) IN LOWER(posts.raw)) > 0
    )
), SecondFilter AS (
    SELECT *
    FROM posts
    WHERE NOT EXISTS (
        -- Garante que NÃO há palavra-chave faltando no texto da postagem
        SELECT 1
        FROM UNNEST(ARRAY[:second_list_of_keywords]) AS t(word)
        WHERE POSITION(LOWER(t.word) IN LOWER(posts.raw)) = 0
    )
)

SELECT p.*
FROM posts p
INNER JOIN FirstFilter f ON p.id = f.id
INNER JOIN SecondFilter s ON p.id = s.id
4 curtidas

Obrigado, isso funcionou.

1 curtida

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.