2012-08-22 70 views
3

编辑。我错过了我遇到的一个主要问题。我想显示所有唯一的'device_MAC'行。所以我想这个查询输出3行(按照原始查询)。我遇到的问题是通过dt_short = rn_shortdata表连接到remote_node表,其中表中的dt_short的最大时间戳。MYSQL多对多3表查询

我无法在3个表上运行查询(2有多对多关系)。

我所试图做的事:

  1. 获取每个不同rn_IEEEremotenodes表的最大时间戳(在本例中,这将得到3个不同的短地址rn_short 3行)
  2. 与加入在devicenames表上device_IEEE
  3. 获取每个不同dt_shortdata表的最大时间戳
  4. 加入dt_shortrn_short从上面

现在我遇到问题的查询是,我可以在上面做查询个人,我甚至得到了他们的第一个3连成一个查询,但我似乎无法到正确加入最后一位数据以获得我想要的结果。

我一直在试图解决这个问题。这里是一个SQL小提琴的链接,其中包含所有的测试数据和查询,据我所知,它做我想要的第一行,但从第一行为NULL后的表'数据':

See this SQL fiddle

+0

+1你的努力。 – hims056

回答

0

感谢所有你的答案每个人。我设法通过使用视图来解决问题。 这不是最有效的方式,但我认为它现在会做。 这里是SQL小提琴链接:

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

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 
0

你已经在你的SQL提琴做了查询使用左连接使用内right.Instead加盟,使它会给你的第一排

欢呼声。

2

通过您的要求和数据去之后,它看起来像你只需要改变你的查询,包括对data表而不是一个LEFT JOIN

INNER JOINSQL 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)