Mysql SQL查询提供未知列的错误
我正在用PHP创建一个电能表分析应用程序。我有以下表格结构: 表:“提要”Mysql SQL查询提供未知列的错误,mysql,sql,Mysql,Sql,我正在用PHP创建一个电能表分析应用程序。我有以下表格结构: 表:“提要” | feed_id | device_no | current1 | voltage1 | power_factor_1 | vc1 | ic1 | date_added ------------------------------------------------------------------------------------- | 36752 | 2 | 36.048 | 196.0
| feed_id | device_no | current1 | voltage1 | power_factor_1 | vc1 | ic1 | date_added
-------------------------------------------------------------------------------------
| 36752 | 2 | 36.048 | 196.01 | 0.9 | 1 | 1 | 2014-06-23 14:14:44
| 36753 | 2 | 35.963 | 195.59 | 0.9 | 1 | 1 | 2014-06-23 14:15:34
等等
表:“机器”
| machine_id | machine_phone | machine_name | company_id |
----------------------------------------------------------
| 1 | 2 | ABC Machine | 1 |
| 2 | 093 | DEF Machine | 1 |
我需要每小时一次的记录,为此我写了以下查询:
$sql = "
SELECT
SUM(t.power1) AS 'power1'
, HOUR(t.date) AS 'pulse_hour'
FROM (
SELECT
IF(@diff = 0, 0, (((f.voltage1*f.vc1)*(f.current1*f.ic1)*(f.power_factor_1))/1000) * (@diff/3600)) AS 'power1'
, IF(@diff = 0,0, TIME_TO_SEC(f.date_added) - @diff) AS 'deltaT'
, @diff := TIME_TO_SEC(f.date_added)
, f.date_added AS 'date'
FROM
feeds f,
(SELECT @diff := 0) AS X
left join
machine m
on
f.device_no = m.machine_phone
left join
company c
on
c.company_id = m.company_id
";
$sql .= $params['machine_id'] ? " where f.device_no = '".$params['machine_id']."'" : " where f.device_no > 0";
$sql .= $params['machine_pulse_datetime_from'] ? " and f.date_added >= '".$params['machine_pulse_datetime_from']."'" : "";
$sql .= $params['machine_pulse_datetime_to'] ? " and f.date_added <= '".$params['machine_pulse_datetime_to']."'" : "";
$sql .= $params['company_id'] ? " and c.company_id = '".$params['company_id']."'" : "";
$sql .= "
ORDER BY
f.date_added ASC
) t
GROUP BY HOUR(t.date)
ORDER BY HOUR(t.date) ASC
";
但这一部分给了我以下错误:
Error Code : 1054
Unknown column 'f.device_no' in 'on clause'
你能帮我把这件事弄清楚吗。。。我花了一个小时来回答这个问题:(这是你的
加入:
FROM feeds f,
(SELECT @diff := 0) AS X left join
machine m
on f.device_no = m.machine_phone left join
company c
on c.company_id = m.company_id
FROM feeds f cross join
(SELECT @diff := 0) AS X left join
machine m
on f.device_no = m.machine_phone left join
company c
on c.company_id = m.company_id
问题是您混合了显式联接和隐式联接。您可以通过将逗号替换为交叉联接来解决此问题:
FROM feeds f,
(SELECT @diff := 0) AS X left join
machine m
on f.device_no = m.machine_phone left join
company c
on c.company_id = m.company_id
FROM feeds f cross join
(SELECT @diff := 0) AS X left join
machine m
on f.device_no = m.machine_phone left join
company c
on c.company_id = m.company_id
问题深藏在select
的文档中,即,
非常类似于交叉连接
,但作用域规则除外——即,当识别表别名时。使用逗号时,表别名不会像您预期的那样被识别。它们使用交叉连接
是指:
内部[交叉]连接
和,(逗号)在
缺少联接条件:两者都在
指定的表(即第一个表中的每一行)
连接到第二个表中的每一行)
但是,逗号运算符的优先级小于内部运算符的优先级
连接
,交叉连接
,左连接
,等等。如果混合使用逗号连接
对于其他联接类型,当存在联接条件时,会出现以下错误:
“on子句”中可能出现形式未知的列“col_name”。
有关处理此问题的信息将在本章后面给出
节
您必须使用缺少的feeds表进行连接,这就是您出错的原因我看不出问题的原因,因为您似乎在其中包含feeds表。但是您使用的是隐式连接和显式连接的混合,这有点混乱;我建议显式连接X子查询(即,使用交叉连接,而不仅仅是逗号)。此外,您似乎正在计算记录之间的差异,但选择(以及因此而进行的计算)是在添加ASC
子句之前有效完成的。因此,您的结果可能与预期不符。我只是对此进行了设置和SQL FIDLE,并切换交叉连接修复了问题-