Mysql SQL查询提供未知列的错误

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

我正在用PHP创建一个电能表分析应用程序。我有以下表格结构:

表:“提要”

| 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,并切换交叉连接修复了问题-