# Получение всех постов для заданного ID категории, соответствующих определенным параметрам

**URL:** https://meta.discourse.org/t/getting-all-posts-for-a-given-category-id-matching-certain-parameters/357475
**Category:** Data & reporting
**Tags:** sql-query
**Created:** [16.Март.2025 23:17:39 UTC](https://meta.discourse.org/t/getting-all-posts-for-a-given-category-id-matching-certain-parameters/357475 "2025-03-16T23:17:39Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![JohnMcDonald](https://avatars.discourse-cdn.com/v4/letter/j/8edcca/32.png) [@JohnMcDonald](https://meta.discourse.org/u/JohnMcDonald)
#### Post date: [16.Март.2025 23:17:39 UTC](https://meta.discourse.org/t/getting-all-posts-for-a-given-category-id-matching-certain-parameters/357475/1 "2025-03-16T23:17:39Z")

</div>

Я написал SQL-запрос, который извлекает все посты на моём сайте, содержащие определённые ключевые слова, но я хочу ограничить выборку постами из конкретной категории. Подскажите, пожалуйста, как это сделать, учитывая, что (как я понимаю) поле category\_id отсутствует в таблице “posts”? Вот мой запрос (я его уже выполнил, и он работает корректно, но извлекает данные из всех постов, а мне нужны только посты из одной категории):

```plaintext
-- [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 (
        -- Убедитесь, что в тексте поста НЕТ отсутствующего ключевого слова
        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

```

---

<div class="post-metadata">

### Author: ![Alteras](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alteras/32/179824_2.png) [@Alteras](https://meta.discourse.org/u/Alteras)
#### Post date: [17.Март.2025 00:13:17 UTC](https://meta.discourse.org/t/getting-all-posts-for-a-given-category-id-matching-certain-parameters/357475/2 "2025-03-17T00:13:17Z")

</div>

Просто нужно расширить предложение `WHERE`, чтобы искать `topic_id` в таблице `topics`, которая содержит столбец `category_id`.

```sql
-- [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 (
        -- Убедитесь, что в тексте поста нет ни одного отсутствующего ключевого слова
        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

```

---

<div class="post-metadata">

### Author: ![JohnMcDonald](https://avatars.discourse-cdn.com/v4/letter/j/8edcca/32.png) [@JohnMcDonald](https://meta.discourse.org/u/JohnMcDonald)
#### Post date: [17.Март.2025 17:22:13 UTC](https://meta.discourse.org/t/getting-all-posts-for-a-given-category-id-matching-certain-parameters/357475/3 "2025-03-17T17:22:13Z")

</div>

Спасибо, это сработало.

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [16.Апрель.2025 17:23:10 UTC](https://meta.discourse.org/t/getting-all-posts-for-a-given-category-id-matching-certain-parameters/357475/4 "2025-04-16T17:23:10Z")

</div>

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