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。。。谢谢你的帮助,我需要一个额外的加入,这是我自己想出来的。你帮我找到了正确的方向。谢谢