带有左连接的mySQL中的嵌套集

时间:2013-10-09 12:23:31

标签: mysql left-join nested-sets

有人可以向我解释一下,为什么这个mysql查询会在“on子句”中抛出“未知列'n.Id'”错误?这对我来说真的没有任何意义。

SELECT n.Id,
       n.Name,
       COUNT(*)-1 AS level,
       seo.URLName
FROM NestedSetsTable AS n,
     NestedSetsTable AS p
LEFT JOIN SEO__Table AS seo
ON seo.ElementId = n.Id
AND seo.ElementCat = 1
WHERE n.lft BETWEEN p.lft AND n.rgt
GROUP BY n.lft
ORDER BY n.lft

基本上,NestedSetsTable有列Id,Name,lft,rgt,而seo表有一个 ElementId(包含Categorie的id),ElementCat(包含int,在本例中为1,类别为2,例如2),URLName(包含干净URL的名称.example.com/Categories/例如myCleanName)

谢谢

编辑:我解决了这个问题,但我之所以要问的原因是因为我想弄明白为什么n.Id在ON子句中是未知的,因为它对我来说没有任何意义。

2 个答案:

答案 0 :(得分:1)

您的联接语法不正确。我不确定你想如何加入你对NestedSetsTable的两个引用,所以现在我假设它是Id的内部联接。此外,我不记得MySQL如何处理分组,但通常您需要对查询中的所有非聚合列进行分组,例如n.Id, n.Name, seo.URLName

SELECT n.Id,
       n.Name,
       COUNT(*)-1 AS level,
       seo.URLName
FROM NestedSetsTable AS n
CROSS JOIN NestedSetsTable AS p
LEFT JOIN SEO__Table AS seo
ON seo.ElementId = n.Id
AND seo.ElementCat = 1
WHERE n.lft BETWEEN p.lft AND n.rgt
GROUP BY n.lft
ORDER BY n.lft

答案 1 :(得分:-1)

将条件AND seo.ElementCat = 1移至WHERE子句: ....

LEFT JOIN SEO__Table AS seo ON seo.ElementId = n.Id WHERE n.lft BETWEEN p.lft AND n.rgt AND seo.ElementCat = 1

...