때때로 특정 카테고리에 속한 주제에 대한 정보를 찾고, 해당 카테고리의 하위 카테고리 내 모든 주제까지 포함하고 싶을 수 있습니다. 각 하위 카테고리의 category_id를 쿼리에 추가할 수는 있지만, 카테고리/하위 카테고리 구성에 따라 상당히 긴 목록이 생성될 수 있습니다. ![]()
대안으로 categories 테이블을 조인하고 OR을 사용할 수 있습니다:
(값을 상위 카테고리의 ID로 수정하세요)
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id = 5 OR c.parent_category_id = 5)
파라미터를 사용하여 이 쿼리를 적용할 수도 있습니다:
-- [params]
-- int :category_id
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id = :category_id OR c.parent_category_id = :category_id)
여러 카테고리 및 하위 카테고리를 처리하도록 수정하려면, 파라미터를 int_list 버전으로 교체하고 쿼리를 IN을 사용하도록 조정하면 됩니다:
-- [params]
-- int_list :category_id
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id IN (:category_id) OR c.parent_category_id IN (:category_id))
또는 상위 카테고리를 쿼리 자체에 하드코딩할 수도 있습니다:
SELECT
t.category_id,
t.id AS topic_id
FROM topics t
JOIN categories c ON c.id = t.category_id
WHERE (c.id IN (4, 5) OR c.parent_category_id IN (4, 5))
이러한 쿼리는 원칙을 시연하기 위한 예시입니다. 유용하게 활용되기를 바라며, 질문이 있으시면 아래에 남겨주세요. ![]()