2013-10-09 67 views
0

任何人都可以请解释给我,为什么这个MySQL查询抛出'未知列n.Id'在'子句'“错误?这对我来说确实没有任何意义。在MySQL中与左连接嵌套集

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,名称,LFT,RGT和SEO表具有 ElementId(其中包含Categorie的id),ElementCat(包含在这种情况下为INT,1对于类,2将产品为例),URLNAME(其中包含一个URL干净名example.com/Categories/myCleanName例如)

谢谢

编辑:我解决了这个问题,但我问的原因是因为我想知道为什么n.Id在ON子句中是未知的,因为它确实使n o感觉到我。

+0

我不积极,但我将不得不猜测这是因为你将ANSI连接样式与theta样式相结合。你怎么修好它的? – AgRizzo

+0

我固定它通过简单地再选择这样的URLNAME: SELECT n.Id, n.Name, COUNT(*) - 1 AS电平, (SELECT seo.URLName FROM SEO__Table AS SEO WHERE seo.ElementId =正.Id AND ElementCat = 1)AS URLName FROM ... – Fitzi

回答

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 
+0

恐怕我认为连接语法应该没问题,尤其是因为如果您将n.Id替换为p.Id,那么所有类别的输出都是正确的,级别,只是URLName是每个类别的顶级父项之一。 我从本教程的嵌套集(http://www.klempert.de/nested_sets/#kap3(它是用德语))得到的基本查询 在你的例子中,水平总是为零,因为内在加入。 – Fitzi

+0

@Fitzi你引用的例子中的连接是n和p上的交叉连接,所以我可以基于此来更新我的示例。 –

+0

是的,交叉连接在这一个上工作,但关卡再次不正确(只计数每行)。 而我已经通过在select中加入子选择来解决问题,我只是想知道为什么n.Id在上面的例子中是未知的。 – Fitzi

-1

移动的标准AND seo.ElementCat = 1WHERE条款: ....

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

...

+0

这不会影响on子句中的“未知列”n.Id – Fitzi

+0

当语法指出要执行连接时,某些SQL环境会引发误导性错误消息,但由于您尚未定义连接,所以无法解析连接两个列都可以进行连接。 “= 1”不是定义的列。但是,感谢这位倒票哥们!大声笑 –

+0

我很抱歉,但语法是正确的。 Brian Driscoll只是解释了为什么我的问题没有奏效。 (看他的回答评论) – Fitzi