在我的网站上,我有几篇文章,每篇文章都分配到一个类别的位置。这是它已经设置了很长一段时间,所以我不能改变它的工作方式。
这些关系设置在两个表中, 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表以显示此信息。有谁知道我怎么能这样做?答案 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'