2012-02-27 56 views
2

我試圖選擇長度小於16個字符的字段爲timestamp的行。我已經試過如下:在MySQL中有長度(字段)

SELECT LENGTH(timestamp), id 
FROM my_table 
HAVING LENGTH(timestamp) < 16 

但我得到這個錯誤:

#1054 - Unknown column 'timestamp' in 'having clause'

有什麼建議?

+0

請使用'SHOW CREATE TABLE my_table'並告訴我們您的實際表定義。 – Kaii 2012-02-27 11:38:11

+0

'CREATE TABLE \'my_table \'( \'id \'int(11)NOT NULL AUTO_INCREMENT, \'title \'text CHARACTER SET utf8 NOT NULL, \ board_id \ (1)NOT NULL, \'preview \'text CHARACTER SET utf8 NOT NULL, \'expired'int(012) 11)NOT NULL, \ full \'mediumtext CHARACTER SET utf8 NOT NULL, PRIMARY KEY(\'id \') )ENGINE = MyISAM AUTO_INCREMENT = 1442 DEFAULT CHARSET = cp1251 COLLATE = cp1251_bin' – user1235446 2012-02-27 12:21:56

+0

我找到了解決方案。在早期版本的MySQL適當的變體是 'SELECT LENGTH(\'時間戳\')AS臨時 FROM MY_TABLE GROUP BY長度(\'時間戳\') HAVING溫度<16' – user1235446 2012-02-27 13:32:31

回答

7

我想你想:

SELECT LENGTH(`timestamp`), id 
FROM my_table 
WHERE LENGTH(`timestamp`) < 16 

或者如果你實際上是試圖組的結果...

SELECT LENGTH(`timestamp`) 
FROM my_table 
GROUP BY LENGTH(`timestamp`) 
HAVING LENGTH(`timestamp`) < 16 

注意反引號(`)在每個例子中逃脫列名稱。

+2

+1 - 因爲'timestamp'是MySQL中的保留字。 – 2012-02-27 11:41:51

+0

是的,我想要第一個變體。我知道在WHERE子句中使用聚合函數是不可能的,所以我嘗試使用HAVING。無論如何,如果我添加「GROUP BY ID」或「GROUP BY LENGTH(時間戳)」,則不會有任何變化。我仍然得到相同的錯誤,但是必填字段肯定存在。 – user1235446 2012-02-27 11:42:41

+0

@ user1235446確保你在前後用反引號字符寫'時間戳'(空格僅用於格式化,不需要)。 'timestamp'在MySQL中是保留的,所以你需要告訴解析器明確地將它當作字段名。 – Yuck 2012-02-27 11:44:22

0

我認爲這將是努力:

SELECT DISTINCT 
    LENGTH(timestamp) 
FROM my_table 
WHERE LENGTH(timestamp) < 16 
+0

這可行,但我認爲在WHERE子句中使用LENGTH並不是一個好主意,因爲它與SQL標準相矛盾,如果我沒有弄錯的話。 – user1235446 2012-02-27 11:49:37