2012-08-22 3 views
3

EDIT. J'ai raté le principal problème que j'avais. Je veux afficher toutes les lignes uniques 'device_MAC'. Je veux donc que cette requête génère 3 lignes (selon la requête d'origine). Le problème que je rencontre est la connexion de la table data au tableau remote_node via dt_short = rn_short où l'horodatage maximum pour dt_short dans le tableau data.MYSQL many to many 3 tables requête

Je rencontre des problèmes pour exécuter une requête sur 3 tables (2 ont plusieurs relations).

Ce que je suis en train de faire:

  1. Obtenez chaque rn_IEEE distinct de la table remotenodes avec l'horodatage maximale (dans l'exemple, il obtiendra 3 rangs avec 3 adresses courtes distinctes rn_short)
  2. Joignez-vous à la table devicenames sur device_IEEE
  3. Obtenez chaque dt_short distinct de la table data avec l'horodatage maximale
  4. Rejoignez dt_short avec rn_short de la requête ci-dessus

Maintenant, le problème, je suis en cours d'exécution en est que je peux faire les requêtes pour ce qui précède individuellement, j'ai même obtenu les 3 premiers d'entre eux ensemble dans une requête, mais je ne peux pas sembler joindre correctement le dernier bit de données pour obtenir le résultat que je veux.

Je suis allé en rond en essayant de résoudre ce problème. Voici un lien vers SQL Fiddle qui contient toutes les données de test et la requête autant que je l'ai eu, il fait ce que je veux pour la première ligne mais de table 'data' après la première ligne est NULL:

See this SQL fiddle

+0

+1 pour votre effort. – hims056

Répondre

0

Merci pour toutes vos réponses à tous. J'ai réussi à résoudre le problème en utilisant des vues. Ce n'est pas le moyen le plus efficace, mais je pense que ça ira pour le moment. Voici le lien SQL Fiddle:

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

0

Essayez cette requête, pour moi le retour d'une ligne:

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

ce que vous avez fait la requête dans votre violon SQL est right.Instead de gauche en utilisant joindre l'utilisation jointure interne afin qu'il vous donnera la première rangée

acclame.

2

Après avoir traversé vos besoins et les données, il semble que vous avez juste besoin de changer votre requête pour inclure un INNER JOIN sur la table data au lieu d'un LEFT JOIN

Voir 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)