Display Articles of Sub Categories in a Main Category PHP MYSQL

Refresh

February 2019

Views

2.1k time

1

I have a category table

cat_id, cat_name, parent_id, cat_slug

and I have article table as follow

art_id, cat_id, art_title, art_content, author_id .....

and my users table as

user_id, username, pw, .....

so with these data, I want to display all articles which are listed under sub category

for example:

url of main category is: mydomain.com/cat/business url of sub category is: mydomian.com/cat/business/advertising

so when people visit the main category, then it should display the subcategories listed articles on main category even though the cat_id is not mentioned as main category. I want to list out all sub categories of business's subcategories articles on business category page.

what is the query, i should try to achieve this

help will be appreciated. thanks

2 answers

4

Во-первых, чтобы получить ваши категории ...

Если категория вложенность только два уровня вложенности (родитель и ребенок) или Вас интересуют только прямые подкатегорий (т.е. не подкатегории подкатегорий), то ваш SQL довольно прост:

SELECT cat_id FROM category_table WHERE cat_id = $catid OR parent_id = $catid

Если вложенность глубже, то вам нужно рекурсивно опрашивать, как далеко вниз, как ваша категория вложенности идет. Например, если вы ограничиваете себя 3 уровня, вы можете сделать это с помощью SQL, как это:

SELECT cat_id FROM category_table ct1
WHERE cat_id = $catid OR parent_id = $catid
OR parent_id in (SELECT cat_id FROM category_table WHERE parent_id = ct1.cat_id)

Точно так же, для глубокой вложенности 4 уровня, вы можете сделать SQL еще сложнее:

SELECT cat_id FROM category_table ct1
WHERE cat_id = $catid OR parent_id = $catid
OR parent_id in (SELECT cat_id FROM category_table ct2 WHERE parent_id = ct1.cat_id
                 OR parent_id in
                 (SELECT cat_id FROM category_table ct3 WHERE parent_id = ct2.cat_id))

И так далее.

Если у вас нет фиксированного вложенности, то вам нужно сделать зацикливание в коде.

После того, как у Вас есть все категории, то вы запрашиваете статьи. Таким образом, для простого зависимости 2 уровня, вы получите

SELECT * FROM article_table
WHERE cat_id in (SELECT cat_id FROM category_table WHERE cat_id = $catid OR parent_id = $catid)

Аналогично для гнездования 3 уровня, вы получите

SELECT * FROM article_table
WHERE cat_id in
    (SELECT cat_id FROM category_table ct1
     WHERE cat_id = $catid OR parent_id = $catid
     OR parent_id in (SELECT cat_id FROM category_table WHERE parent_id = ct1.cat_id))

И так далее...

0
select * from category where parent_id=cat_id

Здесь для данного cat_id, он будет получать все sub_categories для этого.