MySQL:选择一个条目';父母和祖父母的名字

MySQL:选择一个条目';父母和祖父母的名字,mysql,Mysql,在我的网站上,我有几篇文章,每篇文章都被分配到一个带有类别的位置。这是它的设置方式已经有相当一段时间了,所以我不能改变它的工作方式 在两个表(类别和类别职位)中设置了它们之间的关系: 因此,分类文章包含所有文章的条目id的列表,以及它们被分配的类别。然后,categories表列出所有类别,包括它们的父类别和它们的URL标题 我试图做的是编写一个查询,对于任何文章条目id,返回其类别名称和url标题,以及其父母和祖父母的名称和url标题 例如,如果我使用999作为条目id,这就是我想要的结果:

在我的网站上,我有几篇文章,每篇文章都被分配到一个带有类别的位置。这是它的设置方式已经有相当一段时间了,所以我不能改变它的工作方式

在两个表(类别和类别职位)中设置了它们之间的关系:

因此,分类文章包含所有文章的条目id的列表,以及它们被分配的类别。然后,categories表列出所有类别,包括它们的父类别和它们的URL标题

我试图做的是编写一个查询,对于任何文章条目id,返回其类别名称和url标题,以及其父母和祖父母的名称和url标题

例如,如果我使用999作为条目id,这就是我想要的结果:

+-----------+---------------+------------------+------------------+------------------+-----------------------+
| cat_name  | cat_url_title | parent_name      | parent_url_title | grandparent_name | grandparent_url_title |
+-----------+---------------+------------------+------------------+------------------+-----------------------+
| Vancouver | vancouver     | British Columbia | british_columbia | Canada           | canada                |
+-----------+---------------+------------------+------------------+------------------+-----------------------+
现在,我一直在写一个查询来实现这一点。我知道如何使用此查询仅获取条目自己的类别名称和url标题:

SELECT cat_name, cat_url_title FROM categories
JOIN category_posts
ON categories.cat_id=category_posts.cat_id
WHERE category_posts.entry_id = 999;
但我如何将父母和祖父母分类?希望这是有道理的


编辑:我刚刚意识到需要修改。我不能确定是否每个文章都会选择独子类别作为类别。也可以选择父母甚至祖父母类别。当我将这样一篇文章的条目id放入查询时,它返回时没有结果。我更新了category_posts表来显示这一点。有人知道我是如何做到这一点的吗?

您可以加入categories表的三个实例来获得:

SELECT
    c1.cat_name,
    c1.cat_url_title,
    c2.cat_name AS parent_name,
    c2.cat_url AS parent_url_title,
    c3.cat_name AS grandparent_name,
    c3.cat_url AS grandparent_url_title
FROM categories c1
INNER JOIN categories c2 ON (c1.parent_id = c2.cat_id)
INNER JOIN categories c3 ON (c2.parent_id = c3.cat_id)
INNER JOIN category_posts p ON (c1.cat_id = p.cat_id)
WHERE p.entry_id = 999;
SELECT 
child.cat_name as child_cat_name, child.cat_url_title as child_cat_url_title, 
parent.cat_name as parent_cat_name, parent.cat_url_title as parent_cat_url_title, 
grandparent.cat_name as grandparent_cat_name, grandparent.cat_url_title as grandparent_cat_url_title 
FROM categories as child 
JOIN category_posts ON child.cat_id=category_posts.cat_id
JOIN categories as parent on child.parent_id = parent.cat_id
JOIN categories as grandparent on parent.parent_id = grandparent.cat_id
WHERE category_posts.entry_id = 999;
请试试这个:

select c.cat_name,c.cat_url_title,
    b.cat_name as cat_name_parent,b.cat_url_title as cat_url_title_parent,
    a.cat_name as cat_name_grandparent,a.cat_url_title as cat_url_title_grandparent
from categories a
inner join categories b on b.parent_id = a.cat_id
inner join categories c on c.parent_id = b.cat_id
inner join category_posts d on c.cat_id = d.cat_id and d.entry_id = '999'
select c.cat_name,c.cat_url_title,
    b.cat_name as cat_name_parent,b.cat_url_title as cat_url_title_parent,
    a.cat_name as cat_name_grandparent,a.cat_url_title as cat_url_title_grandparent
from categories a
inner join categories b on b.parent_id = a.cat_id
inner join categories c on c.parent_id = b.cat_id
inner join category_posts d on c.cat_id = d.cat_id and d.entry_id = '999'