2012-10-13 86 views
1

我得到的標題描述的錯誤:未知列where`條款

Unknown column 'FeedbackType' in 'where clause' 

但我不明白爲什麼。這是我的查詢:

SELECT SQL_CALC_FOUND_ROWS `Appointments`.ID, FeedbackType, FeedbackSubType 
FROM `UserFeedback` 
INNER JOIN `Appointments` ON `Appointments`.ID = `UserFeedback`.Appointments_ID 
INNER JOIN `Reasons` ON `UserFeedback`.FeedbackSubType = `Reasons`.ID 
WHERE `FeedbackType` = 1 ORDER BY `Appointments`.ID ASC 
LIMIT 0, 10 

FeedbackType是在UserFeedback表中的列,外殼是正確的,檢查了好幾遍了。

爲了完整,這是表模式:

CREATE TABLE IF NOT EXISTS `UserFeedback` 
(
    ID bigint(20) NOT NULL AUTO_INCREMENT, 
    FeedbackType int(4) NOT NULL, 
    FeedbackSubType int(4) NOT NULL, 
    Notes varchar(170) NULL, 
    Appointments_ID bigint(20) NOT NULL, 
    IpTracking_ID bigint(20) NOT NULL, 
    PRIMARY KEY (ID), 
    FOREIGN KEY (Appointments_ID) REFERENCES Appointments(Id), 
    FOREIGN KEY (IpTracking_ID) REFERENCES IpTracking(Id)  
) 
ENGINE=MyISAM DEFAULT CHARSET=utf8; 

可能是什麼問題?

[編輯]

這些變體不工作,要麼(因爲FeedbackType不包含保留字/字符,只屬於UserFeedback表):

... WHERE UserFeedback.FeedbackType = 1 
... WHERE `UserFeedback`.`FeedbackType` = 1 
... WHERE FeedbackType = '1' 
etc. 

(實際上我看到他們應該沒有理由)

[編輯2]

我跑SELECT * FROM UserFeedback,以確保它確實包含列,並且我得到了幾行,全部包含列(好吧,INSERT工作沒有錯誤)。

對於上述每個變體,我總是會得到相同的錯誤,總是在WHERE子句中。如果我省略WHERE條款,我會得到未經過濾的結果(包括那些結果中的FeedbackType列),所以它真的很混亂。

[解決方法]

出於某種原因,裏面INNER JOIN條件更換WHERE查詢固定它,@MarinSagovac suggested in his second snippet

SELECT SQL_CALC_FOUND_ROWS `Appointments`.ID, FeedbackType, FeedbackSubType 
FROM `Appointments` 
INNER JOIN `UserFeedback` ON `Appointments`.ID = `UserFeedback`.Appointments_ID 
    AND `UserFeedback`.FeedbackType = 1 
INNER JOIN `Reasons` ON `UserFeedback`.FeedbackSubType = `Reasons`.ID 
ORDER BY `Appointments`.ID ASC 
LIMIT 0, 10 

注意,有沒有WHERE子句現在,但語義應該是一樣的吧?很明顯,該列確實存在,所以錯誤信息有點誤導恕我直言。

+0

@SOaddict:*在 'where子句' 未知列 'UserFeedback.FeedbackType' *(在 'WHERE子句' 或*未知列 'FeedbackType' *如果我省略表名)。 – Lou

+0

你確定這個列存在嗎?沒有列創建表,然後在稍後將它添加到SQL。如果是這樣,那麼「如果不存在」語句將阻止它被添加。運行這個'SELECT * FROM UserFeedback'並告訴我們你在結果中看到了哪些列。 – JConstantine

+0

@JLevett:是的,試過了,它存在。我運行了'SELECT * FROM UserFeedback',它返回了所有6列。我甚至手動將該輸出中的列複製/粘貼到我的查詢中,以確保我沒有(完全)瘋狂。 – Lou

回答

1

試加反引號:

SELECT SQL_CALC_FOUND_ROWS `Appointments`.ID, `FeedbackType`, `FeedbackSubType` 
FROM `UserFeedback` 
INNER JOIN `Appointments` ON `Appointments`.ID = `UserFeedback`.Appointments_ID 
INNER JOIN `Reasons` ON `UserFeedback`.FeedbackSubType = `Reasons`.ID 
WHERE `FeedbackType` = 1 ORDER BY `Appointments`.ID ASC 
LIMIT 0, 10 

加試:

SELECT SQL_CALC_FOUND_ROWS `Appointments`.ID, FeedbackType, FeedbackSubType 
FROM `UserFeedback` 
INNER JOIN `Appointments` ON `Appointments`.ID = `UserFeedback`.Appointments_ID 
INNER JOIN `Reasons` ON `UserFeedback`.FeedbackSubType = `Reasons`.ID 
INNER JOIN `UserFeedback`.`FeedbackType` = 1 ORDER BY `Appointments`.ID ASC 
LIMIT 0, 10 
+0

試過了,沒有工作。 – Lou

+0

嘗試設置SELECT * FROM [....]並查看列出的行的名稱。 –

+0

那麼,如果我完全刪除'WHERE'子句並且它正確返回'FeedbackType'列,查詢就可以工作。 – Lou

2

您是否在Where子句中嘗試了UserFeedback.FeedbackType?

+0

是的,也沒有工作。 – Lou

+0

嘗試對錶和列進行斜向引用(不能使斜體引號出現在此註釋中):'UserFeedback'。'FeedbackType' – blearn

+0

@blearn:是的,我也試過這個變體。雖然我討厭隨機地嘗試這樣的事情,因爲a)如果列不是保留名稱或包含保留字符,則不需要反引號,並且b)除非兩個表包含相同列,否則不需要指定表。所以,我在問爲什麼它不起作用。 – Lou

0
SELECT SQL_CALC_FOUND_ROWS `Appointments`.ID, UserFeedback.FeedbackType, `UserFeedback.FeedbackSubType 
FROM `UserFeedback' 
INNER JOIN `Appointments` ON `Appointments`.ID = `UserFeedback`.Appointments_ID 
INNER JOIN `Reasons` ON `UserFeedback`.FeedbackSubType = `Reasons`.ID 
WHERE UserFeedback.FeedbackType = 1 ORDER BY `Appointments`.ID ASC 
LIMIT 0, 10 

嘗試現在

-2

WHERE子句中試試這個:

WHERE UserFeedback。FeedbackType = '1'

刪除字段的名稱

+0

當然,我可以試試這個,但是...爲什麼?你爲什麼認爲這會起作用? (我沒有downvote,順便說一句)。 – Lou

+0

因爲我在查詢中使用了這種語法並且工作得很好。它運行在mysql和postgres中。 – phsaires

0

外鍵同時使用MyISAM的所有引號(')?

這可能是問題

+0

用MyISAM指定外鍵沒什麼問題,但它不支持的是約束。所以我不明白這會如何影響加入,尤其是因爲其他查詢運作良好。 – Lou