2012-08-22 68 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)