我正在使用它:
SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009;
但它给了我一个错误:
Unknown column 'year' in 'where clause'SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009
“my_unix_timestamp_column”和“table_name”都是正确的,我不知道为什么它给了我这个!!!
我正在使用PHP 5.3.0
答案 0 :(得分:23)
我不太确定这是因为YEAR
是MySQL中的保留字还是因为它希望你做一些事情:
SELECT
FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year
FROM
table_name
WHERE
FROM_UNIXTIME(my_unix_timestamp_column, '%Y') = 2009;
不记得上一期是否仅与GROUP
相关:S
答案 1 :(得分:4)
SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year`
FROM table_name
HAVING `year` = 2009
与WHERE
子句不同,HAVING
子句可以引用SELECT
子句别名。
更有效的指数方式是:
SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year`
FROM table_name
WHERE my_unix_timestamp_column >= UNIX_TIMESTAMP('2009-01-01')
AND my_unix_timestamp_column < UNIX_TIMESTAMP('2010-01-01')
答案 2 :(得分:3)
另一种选择,避免重复大函数调用:
SELECT year
FROM (SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year
FROM table_name) AS list_of_years
WHERE year = 2009;
您可能仍需要在“年份”一词周围使用反引号,以避免与YEAR作为关键字发生冲突。优化器不需要创建中间表来回答此查询。
答案 3 :(得分:0)
您无法使用在SELECT
子句
WHERE
部分的列
将where子句中的year
变量替换为实际函数以创建该列(又名FROM_UNIXTIME(my_unix_timestamp_column, '%Y')
),你应该没问题。
这是因为在SELECT
部分完成匹配行返回之前,查询的WHERE
部分才会执行。
答案 4 :(得分:0)
WHERE部分在字段列表中的别名之前执行。最好的方法是在WHERE子句中使用BETWEEN,这样就可以使用索引。