MySQL - 这个查询出了什么问题?

时间:2018-01-31 13:37:10

标签: mysql sql

我正在运行此查询并收到错误:

select mst_machine.MachineName, 
  FROM_UNIXTIME(trn_dacs.DateTime,'%Y-%m-%d %H:%i:%s') as dataTimeStamp,     
  trn_dacs.TargetWeight as dataValue, 
  trn_dacs.Weight 
FROM trn_dacs 
  INNER JOIN mst_machine ON trn_dacs.MachineNo = mst_machine.MachineNo 
where dataTimeStamp >= '1/31/2018 7:21:16 AM'

错误是:

  

1054 - 'where子句'

中的未知列dataTimeStamp

我对MySQL的熟悉程度与SQL Server不同。我确定我之前在SQL Server中完成了这个。

如果没有where子句,查询运行正常,列标题会正确显示dataTimeStamp。 (仅供参考)。

另外 - 我知道我可以通过将trn_dacs.DateTime替换为dataTimeStamp来实现这一点,但是,我需要为该时间戳使用别名,这样我总是可以为任何表结构自动生成where子句。

3 个答案:

答案 0 :(得分:2)

您不能在where子句中使用别名,请使用:

WHERE FROM_UNIXTIME(trn_dacs.DateTime,'%Y-%m-%d %H:%i:%s') >= '1/31/2018 7:21:16 AM' 代替: where dataTimeStamp >= '1/31/2018 7:21:16 AM'

答案 1 :(得分:0)

正如其他人的评论中所述,您不能使用SELECT子句中WHERE子句的列别名。

您可以使用的一种方法是使用HAVING子句而不是WHERE子句。这不一定表现良好(因为MySQL不能使用索引来满足过滤),但它满足您的要求,因为我理解它们:

select mst_machine.MachineName, 
  FROM_UNIXTIME(trn_dacs.DateTime,'%Y-%m-%d %H:%i:%s') as dataTimeStamp,     
  trn_dacs.TargetWeight as dataValue, 
  trn_dacs.Weight 
FROM trn_dacs 
  INNER JOIN mst_machine ON trn_dacs.MachineNo = mst_machine.MachineNo 
HAVING dataTimeStamp >= '2018-01-31 07:21:16'

另一种选择是使用WHERE子句中的列,并将函数应用于用于过滤的时间戳。这可能会表现得更好,因为MySQL可以使用索引(如果有的话)进行过滤:

select mst_machine.MachineName, 
  FROM_UNIXTIME(trn_dacs.DateTime,'%Y-%m-%d %H:%i:%s') as dataTimeStamp,     
  trn_dacs.TargetWeight as dataValue, 
  trn_dacs.Weight 
FROM trn_dacs 
  INNER JOIN mst_machine ON trn_dacs.MachineNo = mst_machine.MachineNo 
WHERE trn_dacs.DateTime >= unix_timestamp('2018-01-31 07:21:16')

答案 2 :(得分:-1)

试试这个

SELECT mst_machine.MachineName,
  FROM_UNIXTIME(trn_dacs.DateTime,'%Y-%m-%d %H:%i:%s') AS dataTimeStamp,
  trn_dacs.TargetWeight                                AS dataValue,
  trn_dacs.Weight
FROM trn_dacs
INNER JOIN mst_machine
ON trn_dacs.MachineNo = mst_machine.MachineNo
WHERE FROM_UNIXTIME(trn_dacs.DateTime,'%Y-%m-%d %H:%i:%s')  >= '1/31/2018 7:21:16 AM'