我正在为类别使用嵌套集。我了解查找深度和叶节点等的基本原理
我正在制作的网站是多语言的,因此需要根据用户选择的语言显示类别名称。url是常量。
简化的表格如下。。。
类别:
+----+-----+-----+-------------------------+
| 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
。这正是你所期望的,因为我正在匹配父母
JOIN正在杀死我。如果我尝试JOIN node.id = category_info.category_id
,那么我会收到一个错误,告诉我找不到node.id,就像我使用JOIN categories.id = category_info.category_id
一样。
我知道我一定很接近,但我真的想不通。
你能试试这个吗?
SELECT node.*, category_info.name, (COUNT(parent.url) - 1) AS depth
FROM categories AS node INNER JOIN
^^^^^^^^^^^ <= this is added
categories AS parent
JOIN category_info ON node.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
当JOIN
缺失时,该列不能在ON
子句中引用,但可以在WHERE
部分中引用
这是我试过的。
mysql> SELECT * FROM t1 tab1 INNER JOIN t1 tab2 INNER JOIN t2 tab3 ON tab1.a = tab3.a;
Empty set (0.00 sec)
mysql> SELECT * FROM t1 tab1, t1 tab2 INNER JOIN t2 tab3 ON tab1.a = tab3.a;
ERROR 1054 (42S22): Unknown column 'tab1.a' in 'on clause