【发布时间】:2013-12-03 11:53:08
【问题描述】:
我正在为类别使用嵌套集。我了解查找深度和叶节点等的基本原理。
我正在制作的网站是多语言的,因此需要根据用户选择的语言显示类别名称。网址是不变的。
简化表格如下...
类别:
+----+-----+-----+-------------------------+
| id | lft | rgt | url |
+----+-----+-----+-------------------------+
| 1 | 1 | 12 | top_level |
| 2 | 2 | 5 | foo |
| 3 | 3 | 4 | foo_sub_cat |
| 4 | 6 | 11 | bar |
| 5 | 7 | 8 | bar_sub_cat_1 |
| 6 | 9 | 10 | bar_sub_cat_2 |
+----+-----+-----+-------------------------+
类别信息:
+-------------+---------+----------------------------+
| category_id | lang_id | name |
+-------------+---------+----------------------------+
| 1 | 1 | One cat to rule them all |
| 2 | 1 | Foo Cat |
| 3 | 1 | Subcategory of Foo |
| 4 | 1 | Bar Cat |
| 5 | 1 | Bar SubCat |
| 6 | 1 | Another Bar SubCat |
+-------------+---------+----------------------------+
我运行的查询是这样的……
SELECT node.*,
category_info.name,
( Count(parent.url) - 1 ) AS depth
FROM categories AS node,
categories AS parent
JOIN category_info
ON parent.id = category_info.category_id
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND category_info.lang_id = 1
GROUP BY node.url
ORDER BY node.lft
在上面的示例中,返回的是每个结果的名称One cat to rule them all。这是您所期望的,因为我匹配的是 parent.id。
JOIN 让我很生气。如果我尝试JOIN node.id = category_info.category_id,那么我会收到一条错误消息,告诉我找不到node.id,就像我使用JOIN categories.id = category_info.category_id一样。
我知道我一定很接近,但我真的想不通。
【问题讨论】:
-
您能给我们提供
node.id = category_info.category_id的完整查询吗? -
我不确定你的意思。我尝试将查询的第 4 行 (
JOIN category_info ON parent.id = category_info.category_id) 替换为JOIN category_info ON node.id = category_info.category_id,但那是我收到一个错误消息,提示找不到 node.id。 -
我说的是.. "如果我尝试 node.id = category_info.category_id 那么我得到一个错误"我需要你尝试过的查询。啊哈。已经在上面的评论中解释过了。对不起。
-
好的,我把问题编辑得更清楚了。
标签: php mysql nested-sets