MySQL:选择条目的父母和祖父母姓名

时间:2015-09-29 20:51:17

标签: mysql

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

这些关系设置在两个表中, categories category_posts

categories

+--------+------------------+------------------+-----------+
| cat_id | cat_name         | cat_url_title    | parent_id |
+--------+------------------+------------------+-----------+
|  1     | Toronto          | toronto          | 2         |
|  2     | Ontario          | ontario          | 3         |
|  3     | Canada           | canada           | 0         |
|  4     | Vancouver        | vancouver        | 5         |
|  5     | British Columbia | british_columbia | 3         |
|  6     | Montreal         | montreal         | 7         |
|  7     | Quebec           | quebec           | 3         |
|  8     | San Francisco    | san_francisco    | 9         |
|  9     | California       | california       | 10        |
|  10    | United States    | united_states    | 0         |
+--------+------------------+------------------+-----------+

category_posts

+----------+--------+
| entry_id | cat_id |
+----------+--------+
| 990      | 1      |
| 991      | 4      |
| 992      | 8      |
| 993      | 6      |
| 994      | 4      |
| 995      | 4      |
| 996      | 1      |
| 997      | 6      |
| 998      | 8      |
| 999      | 4      |
| 1000     | 3      |
| 10001    | 10     |
+----------+--------+

所以类别帖子包含所有文章的列表'条目ID,以及它们分配的类别。然后类别表列出了所有类别,包括其父级和URL标题。

我想要做的是写一个查询,对于任何文章条目ID,返回其类别名称和网址标题,以及其父母和祖父母的名称。

例如,如果我使用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                |
+-----------+---------------+------------------+------------------+------------------+-----------------------+

现在,我有点坚持写一个查询来做到这一点。我知道如何使用此查询获取条目的自己的类别名称和网址标题:

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表以显示此信息。有谁知道我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

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;

答案 1 :(得分:1)

您可以加入类别表的三个实例来获取它:

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;

答案 2 :(得分:0)

请试试这个:

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'