Mysql 同一个表上的Join给出的结果太多

Mysql 同一个表上的Join给出的结果太多,mysql,sql,join,inner-join,Mysql,Sql,Join,Inner Join,我的脑袋一直在想为什么我在下面的查询中得到了太多的结果: 根据以下两个表: 查询: +------------+----+-----------------+--------+----------+ | Date | Id | MeteringPointId | Reason | StatusId | +------------+----+-----------------+--------+----------+ | 2013-08-29 | 60 |

我的脑袋一直在想为什么我在下面的查询中得到了太多的结果:

根据以下两个表:

查询:

+------------+----+-----------------+--------+----------+
| Date       | Id | MeteringPointId | Reason | StatusId |
+------------+----+-----------------+--------+----------+
| 2013-08-29 | 60 |               2 | DAY    |       60 |
| 2013-08-29 | 59 |               2 | INT    |       59 |
| 2013-08-29 | 50 |               3 | DAY    |       50 |
| 2013-08-28 | 58 |               3 | DAY    |       58 |
| 2013-08-28 | 57 |               3 | INT    |       57 |
| 2013-08-28 | 56 |               2 | DAY    |       56 |
| 2013-08-28 | 55 |               2 | INT    |       55 |
及 内容如下:

+-------------+------+---------+----------+---------------------+------+-------------+
| EnergyMeter | Id   | QueryId | Register | Time                | Unit | Value       |
+-------------+------+---------+----------+---------------------+------+-------------+
| 15524067    | 2406 |      59 | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |
| 15524067    | 2609 |      59 | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 |
| 15524067    | 2243 |      59 | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |
| 15524067    | 2448 |      59 | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 |
我使用下面的查询在P4Reading表(同一个表)上创建了一个连接,以获取前15分钟的值。这很好,但我得到了许多价值观。我看起来缺少join或where语句,但却找不到它。我不知道问题是从哪里来的

SELECT `P4Query`.`MeteringPointId`, `table1`.`EnergyMeter`, `table1`.`Register`,
       `table1`.`Time`, `table1`.`Unit`, `table1`.`Value`,
      (`table2`.`Value` - `table1`.`Value`)/1000 as totaal
FROM P4Query, P4Reading table1
INNER JOIN P4Reading table2 ON `table1`.`Time` = (`table2`.`Time` - INTERVAL 15 minute)
WHERE (`P4Query`.`Id` = `table1`.`QueryId`)
ORDER BY `table1`.`Time` DESC;
我预期会出现以下情况:

+-----------------+-------------+----------+---------------------+------+-------------+---------------+
| MeteringPointId | EnergyMeter | Register | Time                | Unit | Value       | totaal        |
+-----------------+-------------+----------+---------------------+------+-------------+---------------+
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 |     0.1380000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |     0.0000000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 |     0.1100000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |     0.0000000 |
但我得到:

+-----------------+-------------+----------+---------------------+------+-------------+---------------+
| MeteringPointId | EnergyMeter | Register | Time                | Unit | Value       | totaal        |
+-----------------+-------------+----------+---------------------+------+-------------+---------------+
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |  5959.4270000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 | -5959.2890000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 |     0.1380000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |     0.0000000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 |     0.1100000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |  5959.2890000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 | -5959.1790000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |     0.0000000 |

我已经准备好了一把小提琴:

这是您的带有表别名的查询,以便阅读:

SELECT pq.`MeteringPointId`, pr1.`EnergyMeter`, pr1.`Register`, pr1.`Time`, pr1.`Unit`,
       pr1.`Value`, (pr2.`Value` - pr1.`Value`)/1000 as totaal
FROM P4Query pq, P4Reading pr1 INNER JOIN
     P4Reading pr2
     ON pr1.`Time` = (pr2.`Time` - INTERVAL 15 minute)
WHERE (pq.`Id` = pr1.`QueryId`)
ORDER BY pr1.`Time` DESC;
您正在混合联接格式。看起来您在
pr1
pr2
之间缺少
id
上的条件。这可能是您想要的:

SELECT pq.`MeteringPointId`, pr1.`EnergyMeter`, pr1.`Register`, pr1.`Time`, pr1.`Unit`,
       pr1.`Value`, (pr2.`Value` - pr1.`Value`)/1000 as totaal
FROM P4Query pq join
     P4Reading pr1
     on pq.`Id` = pr1.`QueryId` join
     P4Reading pr2
     ON pq.`Id` = pr2.`QueryId` and
        pr1.`Time` = (pr2.`Time` - INTERVAL 15 minute)
ORDER BY pr1.`Time` DESC;
这将添加额外的连接条件,并使连接语法保持一致


我对这种情况在时间上有点怀疑(
pr1.time=(pr2.time-INTERVAL 15分钟)
)。这需要时间值的绝对精度。在许多情况下,即使是规则间隔的时间也可能会缩短几毫秒,从而导致相等失败。

我使用的正确查询:

SELECT pq.`MeteringPointId`, pr1.`EnergyMeter`, pr1.`Register`, 
  pr1.`Time`, pr1.`Unit`, pr1.`Value`, 
 (pr2.`Value` - pr1.`Value`)/1000 as totaal
FROM P4Query pq 
JOIN P4Reading pr1 ON pq.`Id` = pr1.`QueryId` 
JOIN P4Reading pr2 ON pq.`Id` = pr2.`QueryId` 
   AND pr1.`Time` = (pr2.`Time` - INTERVAL 15 minute) 
   AND pr1.`Register` = pr2.`Register`
ORDER BY pr1.`Time` DESC;

使用以下查询-

SELECT distinct `table2`.`MeteringPointId`, `table1`.`EnergyMeter`, `table1`.`Register`,
   `table1`.`Time`, `table1`.`Unit`, `table1`.`Value`,
  (`table2`.`Value` - `table1`.`Value`)/1000 as totaal
  FROM P4Query table1
INNER JOIN P4Reading table2 ON `table1`.`Time` = (`table2`.`Time` - INTERVAL 15 minute)
 WHERE (`table1`.`Id` = `table2`.`QueryId`)
ORDER BY `table1`.`Time` DESC;

表1和表2是什么?在我看来,你似乎正在合并3个表是的,@TimBodeit是对的。有三个表正在运行:
P4Query、P4Reading table1和P4Reading table2
。当你有两张桌子在同一张桌子下面时,这是一种隐式的笛卡尔积。看起来这是您的结果的两倍(与您提到的预期相比),请包括所有3个表,否则将很难帮助您。我已包括所有表表表1和表2是P4Reading的别名,因此我可以从中扣除时间-15分钟。正如前面指出的,
来自P4Query,P4Reading table1
是一个
连接
,因为它似乎没有它的
WHERE
,它将(至少部分)笛卡尔坐标。嘿,谢谢,但仍然不是我想要的结果。时间不是问题。时间列中的唯一值将是完整分钟。所以这一切都很好。您给出的示例将Id与QueryId混淆了。我解决了这个问题,但仍然不是我想要的结果。我怀疑是否应该将连接与where子句结合使用。@user1745054。(我修复了连接条件。)我很惊讶这并没有解决问题。可能是我缺乏知识,但我们现在在pr2上连接。
Queryid
在P4Reading pr2被设置为别名之前。这不管用。我在SQLFIDLE中添加了数据以查看它。这是实际数据的导出@用户1745054。现在查询中的版本正好返回六行。这就是你所期待的吗?@Gordon。。。谢谢你的帮助,我需要一个额外的加入,这是我自己想出来的。你帮我找到了正确的方向。谢谢