3

编辑。我错过了我遇到的一个主要问题。我想显示所有唯一的“device_MAC”行。所以我希望这个查询输出 3 行(根据原始查询)。我遇到的问题是通过=将表连接到data表,其中表中的最大时间戳。remote_nodedt_shortrn_shortdt_shortdata

我在 3 个表上运行查询时遇到问题(2 个表有多对多关系)。

我正在尝试做的事情:

  1. rn_IEEE从具有最大时间戳的表中获取每个不同remotenodes(在示例中,这将获得具有 3 个不同短地址的 3 行rn_short
  2. 加入devicenamesdevice_IEEE 上的表
  3. dt_shortdata具有最大时间戳的表中获取每个不同的
  4. dt_short从上面的rn_short查询中加入

现在我遇到的问题是我可以单独对上述内容进行查询,我什至已经将前 3 个一起放入一个查询中,但我似乎无法正确连接最后一点数据以获得我的结果想。

我一直在兜圈子试图解决这个问题。这是一个指向 SQL Fiddle 的链接,其中包含所有测试数据和查询,据我所知,它为第一行执行我想要的操作,但在第一行为 NULL 之后的表“数据”:

看到这个 SQL 小提琴

4

4 回答 4

2

After going through your requirements and the data, it looks like you just need to change your query to include an INNER JOIN on the data table instead of a LEFT JOIN

See SQL Fiddle with Demo

select rn.*, dn.*, d.*
from remotenodes rn
inner join devicenames dn
  on rn.rn_IEEE = dn.device_IEEE
  and rn.rn_timestamp = (SELECT MAX(rn_timestamp) FROM remotenodes 
                              WHERE rn.rn_IEEE = rn_IEEE 
                              GROUP BY rn_IEEE)
inner join data d
  on rn.rn_short = d.dt_short
  AND d.dt_timestamp = (SELECT MAX(d2.dt_timestamp) AS ts
                        FROM data d2 
                        WHERE d.dt_short = d2.dt_short
                        GROUP BY d2.dt_short)
于 2012-08-22T15:00:34.927 回答
0

试试这个查询,对我来说它返回一行:

SELECT rn_short, rn_IEEE, device_name
FROM 
(SELECT DISTINCTROW dt_short FROM (SELECT * FROM `data` ORDER BY `dt_timestamp` DESC) as data ) as a
JOIN 
(SELECT rn_IEEE, rn_short, device_name FROM devicenames dn JOIN (SELECT DISTINCTROW rn_IEEE, rn_short FROM (SELECT * FROM `remotenodes` ORDER BY `rn_timestamp` DESC) as remotenodes GROUP BY rn_IEEE) as rn ON dn.device_IEEE = rn.rn_IEEE) as b
ON a.dt_short = b.rn_short
于 2012-08-22T12:53:58.677 回答
0

您在 SQL 小提琴中所做的查询是正确的。不要使用左连接,而是使用内连接,这样它会给您第一行

干杯。

于 2012-08-22T13:33:02.887 回答
0

Thanks for all your answers everyone. I managed to solve the problem by using views. It's not the most efficient way but I think it will do for now. Here is the SQL Fiddle link:

http://sqlfiddle.com/#!2/4076e/8

于 2012-08-23T07:22:58.273 回答