Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1043 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Faire l'historique d'une table

n°1408567
vinoromano
saoule
Posté le 18-07-2006 à 13:56:24  profilanswer
 

Reprise du message précédent :
en fait je mets les valeurs des champs de la premiere ligne qui m'intéresse dans une variable afin de les comparer avec la deuxieme c'est pour cela row9 avant le while.
Moi aussi je débute c'est pourquoi je demande de corrections avis ou autres
Merci


---------------
Merci
mood
Publicité
Posté le 18-07-2006 à 13:56:24  profilanswer
 

n°1408582
Tamahome
⭐⭐⭐⭐⭐
Posté le 18-07-2006 à 14:11:06  profilanswer
 

Elmoricq a écrit :


 
TANT QUE il reste des résultats
   Chercher la ligne suivante de résultats
  ...
   Mémoriser la ligne courante
FIN TANT QUE[/fixed]


 

vinoromano a écrit :


Code :
  1. duree=0;
  2. heure=0;
  3. result9 = mysql_store_result(&mysql);
  4. int nombre = mysql_num_rows(result9); //nombre de lignes du resultat de mysql_query
  5. if(nombre>0)
  6. {
  7.   row9 = mysql_fetch_array(result9);
  8. // valeur = sprintf("%s",row9[Etat_Serv]);
  9. // heure = sprintf("%s",row9[DateUpdate]);
  10.   while(row9 = mysql_fetch_array(result9))
  11.   {
  12.     if(strcmp(valeur,row9[Etat_serv])==0)
  13.     {
  14.       duree = heure + row9[DateUpdate];
  15.     }
  16.     else
  17.     {
  18.       duree = row9[DateUpdate];
  19.     }
  20.     valeur = sprintf("%s",row9[Etat_Serv]);
  21.     heure = sprintf("%s",row9[DateUpdate]);
  22.   }
  23. }



 
je ferais plutot ca. A voir pour le 1er test, tu ne peux comparer la valeur courante a la valeur précédente puisqu'elle n'existe pas  (j'ai mis 0 pour illustrer)


---------------
Hobby eien /人◕ ‿‿ ◕人\
n°1408602
vinoromano
saoule
Posté le 18-07-2006 à 14:21:09  profilanswer
 

Mais la premiere comparaison serait fausse puisque valeur vaut 0?
Je me trompe?
Merci


---------------
Merci
n°1408632
omega2
Posté le 18-07-2006 à 14:48:34  profilanswer
 

vinoromano > Au niveau algo, ton code est à peu prés correct.
 
Par contre en php, le "+" est une addition numérique et pas une concaténation de chaine de caractére. Quand php tombe sur une opération numérique avec comme valeur des chaines de caractéres il va essayer de les transformer en nombre. En clair, il ne va garder que les caractéres qui précédent le premier caractére ne pouvant pas faire partie d'un nombre.
Si tu voulais concaténer deux chaines, il aurait fallut utiliser l'opérateur "." .
 
A noter qu'une durée est le temps entre deux dates/heures, par conséquent, il ne faut pas ajouter une date/heure à l'autre, mais la retrancher.
 
Difficulté suplémentaire : tes dates/heures sont sous forme de texte ce qui complique encore plus la tache. Il va faloir que tu transformes les chaines en données exploitables par php (par exemple : "strptime" pour obtenir un tableau contenant chaque élément de l'heure dans une case puis "mktime" pour obtenir un nombre qu'on poura traiter avec les opérateurs numérique) puis retrancher le résultat et le retransformer à la fin en date/heure compréhensible par n'importe qui. ( "strftime" )
 
Petit manque dans ton algo : c'est bien, tu arrives normalement à trouver les lignes qui t'intéressent. Mais qu'en est il de l'affichage? ;)
 
Une fois fait tout ça ton code devrait être bon.

n°1408633
omega2
Posté le 18-07-2006 à 14:50:11  profilanswer
 

Tamahome a écrit :

Code :
  1. row9 = mysql_fetch_array(result9);
  2. // valeur = sprintf("%s",row9[Etat_Serv]);
  3. // heure = sprintf("%s",row9[DateUpdate]);
  4. while(row9 = mysql_fetch_array(result9))

je ferais plutot ca. A voir pour le 1er test, tu ne peux comparer la valeur courante a la valeur précédente puisqu'elle n'existe pas  (j'ai mis 0 pour illustrer)

code faux : tu perds la premiére ligne de donnée retourné par mysql.

n°1408639
vinoromano
saoule
Posté le 18-07-2006 à 15:00:32  profilanswer
 

Merci omega2,
Tes conseils me donnent de l'espoir.
Je vais de mon mieux et le poster.
Merci pour les infos et à tout à l'heure si possible pour d'autres explications. Merci.


---------------
Merci
n°1408651
Tamahome
⭐⭐⭐⭐⭐
Posté le 18-07-2006 à 15:32:43  profilanswer
 

omega2 a écrit :

code faux : tu perds la premiére ligne de donnée retourné par mysql.


 
c'est très probable c'est pour ca que j'ai mis " a voir".


---------------
Hobby eien /人◕ ‿‿ ◕人\
n°1409410
vinoromano
saoule
Posté le 19-07-2006 à 14:18:42  profilanswer
 

Je repose ma question avec pour nouvelle contrainte le langage C++ ou C si vous préférez.
Le principal problème est de pouvoir comparer chaque ligne du résultat de la requête avec la ligne suivante.  
Je rappelle que seul le champ Etat.. est à comparer en réalité. Merci pour votre aide.


---------------
Merci
n°1409438
Elmoricq
Modérateur
Posté le 19-07-2006 à 14:39:05  profilanswer
 

L'algorithme reste le même, d'où l'intérêt des algorithmes. ;)  
 
Après pour savoir si ton code est correct, ça dépend de ce que tu as écrit, et donc il faut que tu nous montres ce que tu as fait.
Sachant que ça dépendra aussi de l'API que tu utiliseras.

n°1409650
vinoromano
saoule
Posté le 19-07-2006 à 17:50:23  profilanswer
 

Elmoricq a écrit :

Tel que tu l'as écrite, ta condition sera toujours vraie.


 
Voici pour l'instant ce que j'obtiens mon erreur est quelque part mais je n'ai plus la force de continuer. Voici l'ensemble des codes et le résultats.
Merci de m'aider à corriger.

Code :
  1. <?
  2. $NUM_ROWS_MAX = 20;  //Nombres de lignes par page
  3. if(empty($_REQUEST["order"])){    $order = "";             }
  4. else            {    $order = $_REQUEST["order"];   }
  5. if(empty($_REQUEST["Mac"])){      $Mac = "";             }
  6. else            {    $Mac = $_REQUEST["Mac"];     }
  7. if(empty($_REQUEST["page_number"])){    $page_number = "0";      }
  8. else            {    $page_number = $_REQUEST["page_number"];   }
  9. include ('/root/www/protected/srv_etat/fonction_time.php');
  10. // comment trie l'affichage
  11. switch ($order)
  12. {
  13. case 'ip_wan_az':   $order_data= "ORDER BY ip DESC,`Mac` ASC";      break;
  14. case 'ip_wan_za':   $order_data= "ORDER BY ip ASC,`Mac` ASC";      break;
  15. case 'date_az':  $order_data= "ORDER BY Heure ASC,`Mac` ASC";      break;
  16. case 'date_za':  $order_data= "ORDER BY Heure DESC,`Mac` ASC";      break;
  17. case 'mac_wan_az':  $order_data= "ORDER BY `Mac` ASC,`Mac` ASC";      break;
  18. case 'mac_wan_za':  $order_data= "ORDER BY `Mac` DESC,`Mac` ASC";      break;
  19. case 'status_az':  $order_data= "ORDER BY `Etat_Serv` ASC,`Mac` ASC";      break;
  20. case 'status_za':  $order_data= "ORDER BY `Etat_Serv` DESC,`Mac` ASC";      break;
  21. default : //$order_data= "ORDER BY `date_modif` DESC
  22. $order_data= "ORDER BY Heure DESC,`Mac` ASC";
  23. }
  24. /*Programme d'archivage du serveur de supervision*/
  25.   // Si l'utilisateur est un administrateur
  26. if ( $SESSION_active->user_admin  == "1" )
  27. {
  28.    //Lister tous les Devis
  29.     $sql_table=sprintf("SELECT * FROM Tsrv_serveur WHERE Mac='%s' GROUP BY Heure ASC", $Mac);
  30. }
  31.   // Si l'utilisateur est un commerciale  
  32. if ( $SESSION_active->user_collaborateur== "1" )
  33. {
  34.  $sql_table=sprintf("SELECT * FROM Tsrv_serveur WHERE Mac='%s' GROUP BY Heure ASC", $Mac);
  35. }
  36. $result_table=mysql_query($sql_table) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  37. $num_rows=mysql_num_rows($result_table);
  38.   $limit_page_sql = "";
  39.   if ( $num_rows > $NUM_ROWS_MAX)  //Si il y a plus de ligne a afficher que ceux prevus pas page
  40.   {
  41.     $page_number_start = ($page_number * $NUM_ROWS_MAX);
  42.    // Definir la limite pour la requete SQL
  43.     $limit_page_sql = sprintf ("LIMIT %s , %s", $page_number_start, $NUM_ROWS_MAX );
  44.   } 
  45.   // Inclure la requette pour limiter le nombre de lignes
  46.   $sql_table = sprintf("%s %s", $sql_table, $limit_page_sql);
  47.   // Executer la requette
  48.   $result_table = mysql_query($sql_table);
  49. ?>
  50. Licences
  51. <BR><BR><BR>
  52. <font class="TitreRouge">Liste des licences<hr></font>
  53. <table border="0" class="CenterTable">
  54.   <tr>
  55.  <td>
  56.  <?
  57.     printf("<form name='page_change_form' action='#' method='POST' style='margin: 0px;'>" );
  58.     printf("<select name='page_number' onChange='page_select_change();'>" );
  59.    
  60.     for ($pages = 0; $pages < ($num_rows/$NUM_ROWS_MAX ); $pages ++)
  61.     {
  62.    if ( $page_number == $pages )
  63.     $etat_page_number = "selected";
  64.   else
  65.     $etat_page_number = "";
  66.      printf("<option value='%s' %s>Page %s</option>", $pages,$etat_page_number, $pages);
  67.    
  68.     }
  69.     printf("</select>" );
  70.     printf("</form>" );
  71.  ?>
  72.  </td>
  73.   </tr>
  74. </table>
  75. <BR>
  76. <script type="text/javascript">
  77. function page_select_change() {
  78. form = document.page_change_form;
  79. form.submit();
  80. }
  81. </script>
  82. <table width="80%" border="0"  class="CenterTable">
  83.   <tr class="TableA_titre">
  84.     <td width="2%">Date
  85.  </td>
  86.     <td width="2%">Statut
  87.  </td>
  88.     <td width="2%">Duree
  89.  </td>
  90.   </tr>
  91. <?
  92.    $time=0;
  93.  $valeur="";
  94.  $duration="";
  95.    $sql_table=sprintf("SELECT * FROM Tsrv_serveur WHERE Mac='%s' GROUP BY Heure ASC", $Mac);
  96.  $result_table=mysql_query($sql_table) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  97.  $num_rows=mysql_num_rows($result_table);
  98.  if($num_rows>0)
  99.  {
  100.     $row_table=mysql_fetch_array($result_table);
  101.   $valeur=sprintf("%s",$row_table['Etat_Serv']);
  102.   $duration=sprintf("%s",$row_table['Heure']);
  103.     while($row_table=mysql_fetch_array($result_table))
  104.   {
  105.       ?>
  106.          <tr onmouseover="this.className='TableA_on'" onmouseout="this.className='TableA_off'">
  107.       <?
  108.    
  109.      if(strcmp($row_table['Etat_Serv'],$valeur)==0)
  110.     {
  111.        $time=temps_ecoule($row_table['Heure'],$duration);
  112.      $valeur=sprintf("%s",$row_table['Etat_Serv']);
  113.      $duration=sprintf("%s",$row_table['Heure']);
  114.      printf("<td align=center>%s</td>",$duration);
  115.      printf("<td align=center>%s</td>",$valeur);
  116.      printf("<td align=center>%s</td>",$time);
  117.     }
  118.     else
  119.     {
  120.        $time=temps_ecoule($row_table['Heure'],$duration);
  121.      printf("<td align=center>%s</td>",$duration);
  122.      printf("<td align=center>%s</td>",$valeur);
  123.      printf("<td align=center>%s</td>",$time);
  124.     }
  125.     $valeur=sprintf("%s",$row_table['Etat_Serv']);
  126.     $duration=sprintf("%s",$row_table['Heure']);
  127.   }
  128.  }    
  129. ?>
  130.  </tr>
  131. </table>
  132. <BR>


 
Avec pour fonction de calcul du temps écoulé

Code :
  1. <?
  2. /*programme de calcul du temps écoulé entre deux dates*/
  3. function temps_ecoule($date1, $date2)
  4. {
  5.    //aaaa-mm-jj hh:mn:ss est le format date
  6.  $val1=explode(" ", $date1); // separer aaaa-mm-jj et hh:mn:ss
  7.  $val2=explode(" ", $date2);
  8.  $tab1=explode("-", $val1[0]); //separer aaaa mm et jj
  9.  $tab2=explode("-", $val2[0]);
  10.  $rat1=explode(":", $val1[1]); //separer hh mn et ss
  11.  $rat2=explode(":", $val2[1]);
  12.  //faire le calcul
  13.    $valeur1=mktime($rat1[0],$rat1[1],$rat1[2],$tab1[1],$tab1[2],$tab1[0]);
  14.  $valeur2=mktime($rat1[0],$rat1[1],$rat1[2],$tab2[1],$tab2[2],$tab2[0]);
  15.  $diff=($valeur1-$valeur2)/60;  //minutes
  16.  if($diff<60)
  17.  {
  18.    $temp=$diff-abs($diff);
  19.   $temp=$temp*60;  //secondes
  20.   $time=sprintf("%smn %ss",abs($diff),$temp);
  21.  }
  22.  else
  23.  {
  24.    $diff=$diff/60;  //heures  
  25.   if($diff<24)
  26.   {
  27.      $temp=$diff-abs($diff);
  28.    $temp=$temp*60;  //minutes
  29.    $tempo=$temp-abs($temp);
  30.    $tempo=$tempo*60;  //secondes
  31.    $time=sprintf("%sh %smn %ss",abs($diff),abs($temp),$tempo);
  32.   }
  33.   else
  34.   {
  35.      $diff=$diff/24;  //jours
  36.    $temp=$diff-abs($diff);
  37.    $temp=$temp*24;  //heures
  38.    $tempo=$temp-abs($temp);
  39.    $tempo=$tempo*60; //minutes
  40.    $tempor=$tempo-abs($tempo);
  41.    $tempor=$tempor*60; //secondes
  42.    $time=sprintf("%sjours %sh %smn %ss",abs($diff),abs($temp),abs($tempo),$tempor);
  43.   }
  44.  }
  45.  return $time;
  46. }
  47. ?>


 
Et voilà ce que ça me donne
 
Date   Statut   Duree
2006-07-03 16:02:00 BOOT_OFF 0mn 0s
2006-07-03 16:02:00 BOOT_OFF 0mn 0s
2006-07-03 16:09:11 BOOT_ON 0mn 0s
2006-07-03 16:09:22 UPDATE 2jours 0h 0mn 0s
2006-07-05 10:49:46 BOOT_OFF 0mn 0s
2006-07-05 10:50:05 BOOT_ON 0mn 0s
2006-07-05 10:50:23 UPDATE 1jours 0h 0mn 0s
2006-07-06 09:00:29 BOOT_OFF 0mn 0s
2006-07-06 09:00:44 BOOT_ON 0mn 0s
2006-07-06 11:17:54 UPDATE 0mn 0s
2006-07-06 14:19:45 UPDATE 0mn 0s
2006-07-06 16:35:13 UPDATE 0mn 0s
2006-07-06 16:35:13 UPDATE 1jours 0h 0mn 0s
2006-07-07 11:28:20 BOOT_OFF 0mn 0s
2006-07-07 11:57:18 BOOT_ON 0mn 0s
2006-07-07 14:30:42 BOOT_OFF 0mn 0s
2006-07-07 14:30:54 BOOT_ON 0mn 0s
2006-07-07 16:41:23 UPDATE 3jours 0h 0mn 0s
2006-07-10 14:05:16 BOOT_OFF 0mn 0s
2006-07-10 14:05:16 BOOT_OFF 0mn 0s
2006-07-10 14:05:25 BOOT_ON 0mn 0s
2006-07-11 09:05:44 UPDATE 1jours 0h 0mn 0s
2006-07-11 12:00:26 UPDATE 0mn 0s
2006-07-11 14:50:00 UPDATE 0mn 0s
2006-07-11 17:03:37 UPDATE 0mn 0s
2006-07-12 11:00:55 UPDATE 1jours 0h 0mn 0s
2006-07-12 14:08:48 UPDATE 0mn 0s
2006-07-12 16:18:19 UPDATE 0mn 0s
2006-07-13 09:00:58 UPDATE 1jours 0h 0mn 0s
2006-07-17 09:37:59 UPDATE 4jours 0h 0mn 0s
2006-07-17 10:43:07 UPDATE 0mn 0s
2006-07-17 14:10:02 UPDATE 0mn 0s
2006-07-17 16:52:20 UPDATE 0mn 0s
2006-07-18 09:08:19 UPDATE 1jours 0h 0mn 0s
2006-07-18 09:18:28 UPDATE 0mn 0s
2006-07-18 09:25:17 UPDATE 0mn 0s
2006-07-18 11:55:57 UPDATE 0mn 0s
2006-07-18 14:36:38 UPDATE 0mn 0s
2006-07-18 17:41:26 UPDATE 0mn 0s
2006-07-19 09:20:20 UPDATE 1jours 0h 0mn 0s
2006-07-19 11:25:24 UPDATE 0mn 0s
2006-07-19 15:45:24 UPDATE 0mn 0s
 
J'ai vraiment besoin d'aide.
Merci


---------------
Merci
mood
Publicité
Posté le 19-07-2006 à 17:50:23  profilanswer
 

n°1409657
Elmoricq
Modérateur
Posté le 19-07-2006 à 17:55:25  profilanswer
 

Au fait, je ne réponds pas aux questions traitant directement avec PHP, pour la bonne raison que je ne connais pas ce langage.

n°1409919
vinoromano
saoule
Posté le 20-07-2006 à 09:20:56  profilanswer
 

Bonjour,
Ok Elmoricq, merci déjà pour tout ton aide, j'espère que des spécialistes vont se pencher sur mon problème?
Merci à toutes les personnnes qui pourront m'apporter de leur savoir.


---------------
Merci
n°1410011
omega2
Posté le 20-07-2006 à 10:44:58  profilanswer
 

J'ai pas eu le temps d'analyser le reste mais un petit détail qui te permettra peut être de corriger toute seule ton calcul de date : en mathématique, il existe la notion de modulo. Le modulo, c'est le reste d'une division entiére. En php, l'opérateur modulo est le "%". Du coup, pour avoir le nombre de seconde sans le nombre d'heures et minutes entiéres, il suffit de calculer le nombre total de seconde au modulo 60 (60 secondes dans une minute) En code php, ca donne :

Code :
  1. $sec = $sectotal % 60;

n°1410012
vinoromano
saoule
Posté le 20-07-2006 à 10:46:44  profilanswer
 

Merci, Tu pourrais me préciser la ligne dans mon programme s'il te plaît?
Merci encore


---------------
Merci
n°1410064
omega2
Posté le 20-07-2006 à 11:41:19  profilanswer
 

C'est pas pour une ligne précise, mais pour la partie de la fonction "temps_ecoule" qui suis le calcul de la différence de temps.
En bref, ca donne un truc du genre :

Code :
  1. $sec = $sectotal % 60;
  2. $minutetotal = ($sectotal-$sec) / 60;
  3. $minute = $minutetotal % 60;
  4. ...


$sectotal étant égal à "$valeur1-$valeur2"
 
PS : petite idée que je viens d'avoir et qui est encore plus simple : une fois calculé la différence entre tes deux lignes, tu peux utiliser la fonction date qui te permettra d'obtenir les infos sans t'embêter à les calculer à la main. Voir l'exemple 1 de la page http://fr3.php.net/manual/fr/function.mktime.php et la page http://fr3.php.net/manual/fr/function.date.php pour les détails.

n°1410230
vinoromano
saoule
Posté le 20-07-2006 à 14:56:01  profilanswer
 

Merci Omega2
Je te tiens au courant. Pour le parcours des lignes une à une successivement, j'ai trouvé foreach qui va peut être m'aider.


---------------
Merci
n°1410261
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 15:19:30  profilanswer
 

Elmoricq a écrit :

Au fait, je ne réponds pas aux questions traitant directement avec PHP, pour la bonne raison que je ne connais pas ce langage.


++
 
Sinon, euh...
 
MySQL n'est pas censé supporter le PL/SQL maintenant ?
Si oui, pkoi ne pas faire ça proprement dans la base ?
 
Sorti de ça, c'est quoi "maintenant" le besoin ?
 
Parcequ'en relisant rapidement la question initiale, même si le sens des mots "consécutives" et "identiques" m'échappe un peu, j'ai l'impression que c'est toutà faire faisable avec une requête "toute bête".
 
tu peux poster quelques lignes d'exemple (et pas des xxx sur les parties significatives, parceque ton exemple, je vois pas trop ce qu'on peuten faire), ainsi que ce que tu attends en sortie, avec une explication claire ?
 
moi, de ce que je comprends, à chaque fois qu'on trouve la même adresse MAC, on compare avec l'occurence suivante de cette même adresse.
-> si c'est la même adresse IP, on indique combien de temps a passé entre les deux
-> sinon on fait rien
 
=> et ainsi de suite pour toutes les adresses mac/IP
 
c'est bien ça ?


Message édité par Arjuna le 20-07-2006 à 15:24:55
n°1410331
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 15:55:08  profilanswer
 

Avec Oracle (mais la requête est suffisament simple pour marcher sous MySQL sans problème) :
 
Jeu de test :


create table test_sd
(
   dte date,
   mac int,
   ip int,
   sta char(1)
);
 
insert into test_sd values ('01-01-2006', 1, 1, 'A');
insert into test_sd values ('02-01-2006', 2, 2, 'A');
insert into test_sd values ('03-01-2006', 1, 1, 'B');
insert into test_sd values ('04-01-2006', 2, 2, 'B');
insert into test_sd values ('05-01-2006', 1, 1, 'C');
insert into test_sd values ('06-01-2006', 1, 1, 'D');
insert into test_sd values ('07-01-2006', 2, 2, 'C');
insert into test_sd values ('08-01-2006', 1, 3, 'A');
insert into test_sd values ('09-01-2006', 2, 2, 'D');
 
select * from test_sd;


 


DTE MAC IP STA
01/01/2006 1 1 A
02/01/2006 2 2 A
03/01/2006 1 1 B
04/01/2006 2 2 B
05/01/2006 1 1 C
06/01/2006 1 1 D
07/01/2006 2 2 C
08/01/2006 1 3 A
09/01/2006 2 2 D


 
Requête :


select t1.dte, t1.mac, t1.ip, t1.sta || ' -> ' || nvl(t2.sta, '??') status, nvl(to_char(t2.dte - t1.dte), to_char(sysdate - t1.dte)) || ' jour(s)' duree
from test_sd t2, test_sd t1
where t2.dte(+) > t1.dte
and t2.mac(+) = t1.mac
and t2.ip(+) = t1.ip
and (t2.dte = (select min(t3.dte) from test_sd t3 where t3.mac = t1.mac and t3.ip = t1.ip and t3.dte > t1.dte) or (t2.dte is null and t1.sta != 'D'))
order by t1.mac, t1.ip, t1.dte  


 


DTE MAC IP STATUS DUREE
01/01/2006 1 1 A -> B 2 jour(s)
03/01/2006 1 1 B -> C 2 jour(s)
05/01/2006 1 1 C -> D 1 jour(s)
08/01/2006 1 3 A -> ?? 193,667627314814814814814814814814814815 jour(s)
02/01/2006 2 2 A -> B 2 jour(s)
04/01/2006 2 2 B -> C 3 jour(s)
07/01/2006 2 2 C -> D 2 jour(s)


 
Règles prises en compte :
 
Les status évoluent jusqu'à D : D = arrêt
Si on n'a jamais rencontré D, alors c'est que le dernier statut connu est encore valable maintenant


Message édité par Arjuna le 20-07-2006 à 16:00:31
n°1410346
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:04:02  profilanswer
 

Beegee a écrit :

edit : betsamee, ça me parait jouable en SQL pur ... un bon gros mélange de NOT EXISTS (x2) avec ORDER BY et GROUP BY à la fin ...


 
bien plus simplement que ça ;) (en partant du principe que tes hypothèses et les miennes sont bonnes)

n°1410348
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:05:56  profilanswer
 

betsamee a écrit :

ok je vois ou tu veux en venir :jap:  
mais a ce niveau la de bidouille je suis deja partisan du code  :D


7 lignes de SQL avec une pauvre petite jointureouverte, faut pas pousser mémé dans les orties non plus :o
surtout quand je vois les tartines de code qui ont été pondues par lasuite :pt1cable:

n°1410353
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:07:15  profilanswer
 

ps : si une même adresse MAC peut avoir la même adresse IP dans un bail différent, il faut complexifier un peu la requête (trois fois rien)
 
-- edit : arf, nan, même pas. je viens de tester et y'a rien besoin de toucher :)
(chuis trop un génie en fait :sol:)
 
-- re-edit : arf si :D
 
Rajouter cette ligne :

Code :
  1. and t2.sta(+) > t1.sta


 
sauf que là, les status doivent être triables, donc faut avoir un code et non un libellé (ou alors, il faut se faire chier avec un bon gros DECODE() de mémé)


Message édité par Arjuna le 20-07-2006 à 16:10:59
n°1410357
omega2
Posté le 20-07-2006 à 16:10:55  profilanswer
 

Arjuna > Niveau sql, je suis pas sur que ta requette soit des plus rapide. Faire une requette imbriqué à l'intérieur de la clause where, c'est un coup à rendre l'ensemble bien plus lent. Ca ne m'étonerait pas que la solution du "je récupére tout et fait le tri en php" ne soit pas beaucoup plus rapide à l'arrivé.

n°1410358
vinoromano
saoule
Posté le 20-07-2006 à 16:11:05  profilanswer
 

Attention!
L'information sur l'IP et Mac n'est pas nécessaire, seule le champ Statut ou Etat compte pour la comparaison. En effet, je souhaite juste remplacer les lignes successives qui ont le même etat (UPDATE ou...) par une seule ligne en indiquant la date et la durée totale de l'état.
Merci


---------------
Merci
n°1410362
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:13:28  profilanswer
 

omega2 a écrit :

Arjuna > Niveau sql, je suis pas sur que ta requette soit des plus rapide. Faire une requette imbriqué à l'intérieur de la clause where, c'est un coup à rendre l'ensemble bien plus lent. Ca ne m'étonerait pas que la solution du "je récupére tout et fait le tri en php" ne soit pas beaucoup plus rapide à l'arrivé.


infiniment faux
 
du moins surun bon moteur (Oracle), ce type de sous-requête qui récupère un MIN selon les mêmes critères que la requête principale n'est même pas exécuté : il retrouve ce MIN directement dans le jeu de résultats
 
j'avais trouvé une autre syntaxe qui évite la sous-requête (mais faut encore lier la table sur elle-même et s'emmerder avec un HAVING), c'est beaucoup beaucoup plus lent.
 
quand aux traîtements dans PHP (ou quoique ce soit d'autre...) y'a pas photo : le SGBD est au grand minimum 100 fois plus rapide, même si le moteur du SGBD c'est juste un drivers OLEDB vers un fichier CSV (ça existe :D)

n°1410364
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:15:03  profilanswer
 

vinoromano a écrit :

Attention!
L'information sur l'IP et Mac n'est pas nécessaire, seule le champ Statut ou Etat compte pour la comparaison. En effet, je souhaite juste remplacer les lignes successives qui ont le même etat (UPDATE ou...) par une seule ligne en indiquant la date et la durée totale de l'état.
Merci


je ne comprends pas.
 
exemple stp.
 
j'ai une adresse MAC "MAC1" et une autre "MAC2"
=> poste un exemple de leur vie (avec "STA1", "STA2", etc. et "IP1", "IP2", etc.)
=> et poste le résultat que tu veux en tirer

n°1410367
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:17:14  profilanswer
 

ah, je viens de piger... bouge pas

n°1410369
omega2
Posté le 20-07-2006 à 16:17:59  profilanswer
 

Arjuna a écrit :

infiniment faux
 
du moins surun bon moteur (Oracle), ce type de sous-requête qui récupère un MIN selon les mêmes critères que la requête principale n'est même pas exécuté : il retrouve ce MIN directement dans le jeu de résultats
 
j'avais trouvé une autre syntaxe qui évite la sous-requête (mais faut encore lier la table sur elle-même et s'emmerder avec un HAVING), c'est beaucoup beaucoup plus lent.
 
quand aux traîtements dans PHP (ou quoique ce soit d'autre...) y'a pas photo : le SGBD est au grand minimum 100 fois plus rapide, même si le moteur du SGBD c'est juste un drivers OLEDB vers un fichier CSV (ça existe :D)


Ca doit être une optimisation oracle alors.
Avec mysql (au moins dans les versions 3 et 4.0), quand on fait ça, la requette est exécuté pour chaque ligne de l'ensemble extérieur. Du moins, c'est ce que j'ai toujours appris et je ne me suis pas amusé à chercher les cas particulier surtout depuis qu'on peut mettre des requettes comme table virtuelles dans la partie "from" des requettes.

n°1410371
vinoromano
saoule
Posté le 20-07-2006 à 16:18:20  profilanswer
 

Au début de mon poste j'ai expliqué ce que je voulais ogtenir. Je te le reposte tout de suite


---------------
Merci
n°1410376
vinoromano
saoule
Posté le 20-07-2006 à 16:20:29  profilanswer
 

vinoromano a écrit :

Bonjour tous,
Voici ma table:
 
Date Update                   Adr MAC           Wan IP            statut
2006-07-13 09:00:51 00:40:F4:8A00:40:F4:8A:xxxx:xxxx 193.252.xxxxxx  UPDATE
2006-07-12 16:18:10 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-12 14:08:40 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-12 11:00:29 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-11 17:03:30 00:40:F4:8A:xxxx 193.252.xxxxxx UPDATE
2006-07-11 14:49:52 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-11 12:00:06 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-11 09:05:20 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-10 16:13:45 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-10 14:04:37 00:40:F4:8A:xxxx 193.252.xxxxxx BOOT_ON
2006-07-10 14:04:29 00:40:F4:8A:xxxx 193.252.xxxxxx  BOOT_OFF
2006-07-10 09:10:04 00:40:F4:8A:xxxx 193.252.xxxxxx  BOOT_OFF
2006-07-07 16:41:09 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-07 14:29:58 00:40:F4:8A:xxxx 193.252.xxxxxx  BOOT_ON
2006-07-07 14:29:32 00:40:F4:8A:xxxx 193.252.xxxxxx  BOOT_OFF
2006-07-07 11:57:03 00:40:F4:8A:xxxx 193.252.xxxxxx  BOOT_ON
2006-07-07 11:28:13 00:40:F4:8A:xxxx 193.252.xxxxxx  BOOT_OFF
2006-07-06 16:35:09 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-06 14:19:38 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
2006-07-06 11:17:34 00:40:F4:8A:xxxx 193.252.xxxxxx  UPDATE
 
 
Je voudrais obtenir  
Adr Mac                       Wan IP                     Statut           Durée
00:40:F4:8A:xxxx           193.252.xxxxxx           UPDATE        3jours xheures yminutes
 
00:40:F4:8A:xxxx           193.252.xxxxxx           BOOT_ON      xheures yminutes
 
00:40:F4:8A:xxxx           193.252.xxxxxx           BOOT_OFF     4heures yminutes
 
00:40:F4:8A:xxxx           193.252.xxxxxx           UPDATE        2jours xheures yminutes
 
Ainsi de suite.
Donc pour résumer le travail, je souhaite pouvoir comparer chaque ligne du champ statut et calculer la durée si deux lignes consécutives sont identiques.
Je ne suis qu'une pauvre débutante et vos conseils seront la bienvenue.  
J'ajoute que je ne voudrais pas d'un code tout fait mais des pistes ou fonctions pour faire ce travail.
Merci à tous.


 
 
Voici ce que j'avais posté. Comme on peut le voir, Les Mac et IP sont identiques. Merci


---------------
Merci
n°1410385
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:27:36  profilanswer
 

c'est un peu plus long, mais c'est encore plus simple et rapide (plus de jointure droite)
 

Code :
  1. select t1.mac, t1.ip, t1.sta, min(t1.dte) dt1, t2.dte - min(t1.dte)
  2. from test_sd t2, test_sd t1
  3. where t2.mac = t1.mac
  4. and t2.ip = t1.ip
  5. and t2.sta = t1.sta
  6. and t2.dte =
  7. (
  8.   select max(t3.dte)
  9.   from test_sd t3
  10.   where t3.mac = t1.mac
  11.   and t3.ip = t1.ip
  12.   and t3.sta = t1.sta
  13.   and not exists
  14.   (
  15.     select null
  16. from test_sd t4
  17. where t4.mac = t3.mac
  18. and t4.ip = t3.ip
  19. and t4.sta != t3.sta
  20. and t4.dte between t1.dte and t3.dte
  21.   )
  22. )
  23. group by t1.mac, t1.ip, t1.sta, t2.dte
  24. order by dt1


 
Nouveau jeu de données :

Code :
  1. insert into test_sd values ('01-01-2006', 1, 1, 'A');
  2. insert into test_sd values ('02-01-2006', 2, 2, 'A');
  3. insert into test_sd values ('03-01-2006', 1, 1, 'A');
  4. insert into test_sd values ('04-01-2006', 2, 2, 'B');
  5. insert into test_sd values ('05-01-2006', 1, 1, 'B');
  6. insert into test_sd values ('06-01-2006', 1, 1, 'B');
  7. insert into test_sd values ('07-01-2006', 2, 2, 'C');
  8. insert into test_sd values ('08-01-2006', 1, 1, 'C');
  9. insert into test_sd values ('09-01-2006', 2, 2, 'D');
  10. insert into test_sd values ('11-01-2006', 1, 1, 'A');
  11. insert into test_sd values ('12-01-2006', 2, 2, 'A');
  12. insert into test_sd values ('13-01-2006', 1, 1, 'A');
  13. insert into test_sd values ('14-01-2006', 2, 2, 'B');
  14. insert into test_sd values ('15-01-2006', 1, 1, 'B');
  15. insert into test_sd values ('16-01-2006', 1, 1, 'B');
  16. insert into test_sd values ('17-01-2006', 2, 2, 'C');
  17. insert into test_sd values ('18-01-2006', 1, 1, 'C');
  18. insert into test_sd values ('19-01-2006', 2, 2, 'D');


 
Résultat :

Code :
  1. MAC IP STA DT1 T2.DTE-MIN(T1.DTE)
  2. 1 1 A 01/01/2006 2
  3. 2 2 A 02/01/2006 0
  4. 2 2 B 04/01/2006 0
  5. 1 1 B 05/01/2006 1
  6. 2 2 C 07/01/2006 0
  7. 1 1 C 08/01/2006 0
  8. 2 2 D 09/01/2006 0
  9. 1 1 A 11/01/2006 2
  10. 2 2 A 12/01/2006 0
  11. 2 2 B 14/01/2006 0
  12. 1 1 B 15/01/2006 1
  13. 2 2 C 17/01/2006 0
  14. 1 1 C 18/01/2006 0
  15. 2 2 D 19/01/2006 0


Message édité par Arjuna le 20-07-2006 à 16:30:29
n°1410387
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:28:46  profilanswer
 

ps: par contre, je comprends pas pkoi tu veux pas les MAC et IP... moi je les ai remises, vois pas ce que tu veux obtenir sans...


Message édité par Arjuna le 20-07-2006 à 16:28:58
n°1410398
vinoromano
saoule
Posté le 20-07-2006 à 16:38:43  profilanswer
 

As tu tenu compte des heures minutes et secondes?
Tu peux te débarasser des mac et Ip et ne garder que l'etat. Ensuite déterminer la durée des états successifs et la dernière date de l'etat.
Merci.


---------------
Merci
n°1410404
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 16:45:56  profilanswer
 

Pour ce qui est des heures etc., oui, puisque je soustrait deux dates. tu peux donc t'amuser à exprimer ça en secondes saturniennes si ton SGBD sait faire la conversion, ça ne pose pas de problème.
 
pour la modification des filtres, vu que :
1) je doute fortement que tu doivent effectivement les shooter
2) je suis pas là non plus pour tout te faire
3) de toute façon faut que tu réécrives en partie la requête pour que ça matche ta structure
 
pour la dernière date d'un état, c'est t2.dte dans ma requête
 
ben je te laisse te démerder.
là c'est déjà tout machouillé et prédigéré, vais pas t'emboquer non plus :o


Message édité par Arjuna le 20-07-2006 à 16:47:24
n°1410408
vinoromano
saoule
Posté le 20-07-2006 à 16:52:01  profilanswer
 

En fait j'ai posté pas mal de codes en PHP pour faire voir ce que je pensais être juste mais cela ne marche.
De plus je bute sur l'utilisation de foreach pour pouvoir comparer le champ statut des lignes successivement.
Excuses-moi si je t'ai vexé mais je cherche juste à comprendre.
Merci


---------------
Merci
n°1410441
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-07-2006 à 17:11:57  profilanswer
 

tu m'as pas vexé ;)
 
juste que je t'ai fait 90% du boulot, et que je préfère te laisser faire les 10% restant, plutôt que de te pondre un truc "fini" qui au final ne correspondra pas forcément 100% à tes besoins, et que tu seras incapable de modifier le cas échéant.
 
essaie de comprendre ma requête (copie mon script de jeu de test), et dis-moi où tu bloques (notamment, la syntaxe peut légèrement différer entre Oracle et MySQL, donc déjà, tu peux t'atteler à faire marcher la requête chez toi, puis sur tes données, avant de chercher à en changer le fonctionnement).

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[XHTML] Remplacer des <table> par des ...changer un mot dans toute une table MySQL
count() d'une colonne entière d'une table de données [SQL]inserer un champs dans une table
Comptage du nombre de champs d'une table[MYSQL] Probleme de creation de table
MySQL - sélectionner le premier enregistrement d'une tableAlgo de recursion sur une table ?
[Access]Question sur création de tableUn problème dans une page: écriture dans table sql - gets
Plus de sujets relatifs à : Faire l'historique d'une table


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR