2013-10-09 98 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