2010-08-23 4 views
1

J'ai une table qui m'aide à garder une trace des temps de retard entre mes esclaves et le maître. Ma question est comment puis-je élaborer une déclaration de sélection qui:
1. me donne les dernières valeurs de retard, sans répéter (ou sauter) les adresses IP
2. n'a pas besoin d'être mis à jour si j'ajoute des serveurs supplémentaires, ou comme les serveurs ne répondent plusInstruction de sélection de requête imbriquée MySQL

Le but de cette requête est de me montrer quels serveurs sont disponibles pour travailler, et de me donner une estimation approximative de leur niveau de fonctionnement. Les serveurs qui ne sont pas opérationnels ne devraient pas apparaître dans les résultats. Je cours un script pour évaluer les temps de retard comme CLI chaque minute, donc si je pourrais limiter les enregistrements possibles retournés à la dernière minute et demi, cela devrait être assez bon pour me dire quels serveurs étaient en place la dernière fois qu'ils étaient interrogé.

Le tableau ressemble à ceci (colonnes rebaptisés pour protéger les innocents):

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
ip VARCHAR(20) NOT NULL , 
sent TIMESTAMP NOT NULL , 
delay DECIMAL (7,4) NOT NULL , 
status VARCHAR(100) NOT NULL , 
execution_time` DECIMAL (7,4)NOT NULL , 
deleted` TINYINT NOT NULL , 

Toute aide serait appréciée.

Répondre

0

Après quelques googler, et quelques essais, c'est la meilleure réponse que j'ai trouvé ainsi jusqu'à présent:

SELECT ip, id, delay, stat_sent 
    FROM status 
    WHERE stat_sent > DATE_SUB(NOW() , INTERVAL 1 MINUTE) 
    AND stat_sent 
    IN (

     SELECT max(stat_sent) 
     FROM status GROUP BY stat_ip 
    ) 

Modified ma réponse maintenant il limite la portée des résultats aux serveurs qui ont été mises à jour la dernière minute.

0

Que pensez-vous de cela?

select delay 
    from table_name, 
     (select id, max(sent), ip from table_name group by ip) innertable 
    where innertable.id = table_name.id; 

Pas 100% sûr J'ai compris ce que vous voulez en tant que jeu de résultats, donc je viens de choisir le délai.

+0

Eh bien cela prouve que j'ai encore beaucoup à apprendre, étant donné que je ne savais même pas que c'était possible ... ma requête a fini par ressembler à ceci: SELECT delay, ip FROM status, (SELECT id , max (envoyé) FROM groupe de statut par ip) inertable O WH innertable.id = status.id Cela me donne beaucoup plus à google ... merci. –

+0

Désolé, je pensais que c'était correct, mais je me suis rendu compte qu'il ne restait que mes deux premiers enregistrements. –

+0

La requête interne (sélectionnez id, max (envoyé), ip du groupe nom_table par ip) vous donne les résultats attendus. Je suppose que vous voulez une ligne dans ce jeu de résultats pour chaque adresse IP. Est-ce exact? – MikeTheReader