繁体   English   中英

MYSQL多对3个表进行查询

[英]MYSQL many to many 3 tables query

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

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

我想做什么:

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

现在我遇到的问题是我可以单独对上面的查询进行查询,我甚至将它们中的前三个一起放入查询中但我似乎无法正确加入最后一位数据以获得我的结果想。

我一直在试图解决这个问题。 这是一个指向SQL Fiddle的链接,其中包含所有测试数据和查询,就我所知,它完成了我想要的第一行,但是在第一行为NULL之后从表'data':

看到这个SQL小提琴

在完成您的需求和数据之后,看起来您只需更改查询以在data表中包含INNER JOIN而不是LEFT JOIN

请参阅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)

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

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

你在SQL小提琴中做了什么查询是对的。而不是使用左连接使用内连接,这样它就会给你第一行

干杯。

感谢大家的所有答案。 我设法通过使用视图解决问题。 这不是最有效的方式,但我认为它现在会做。 这是SQL Fiddle链接:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM