2016-01-12 4 views
-2

Je travaille sur un moniteur de données pour les panneaux solaires. Maintenant je travaille sur un espace limité, et j'obtiens beaucoup de données qui sont en train d'être enregistrées sur la base de données. Pour réduire la taille de mon espace, j'essayais de trouver un moyen de faire en sorte que les données décrivent toutes les 15 minutes, puis de les stocker dans une nouvelle table et de supprimer les anciennes tables.Compter les enregistrements de données et supprimer ancienne fois

J'ai essayé de le faire avec un cronjob, et plus tard essayé de faire un script php qui serait le gérer.

Maintenant que ce code ne se rapproche pas de ce que j'avais l'intention d'avoir, et je suis bloqué à ce problème, et je sais qu'il y a probablement des gens qui connaissent la réponse à cette question. J'ai rencontré des problèmes similaires avec la recherche sur le site, mais je n'ai pas rencontré une question "Count and Delete". Ceci pour limiter l'espace utilisé. Simplement dit, j'essaie de trouver un moyen avec php pour le faire compter et stocker les enregistrements de données de "onduleurs" à "inverters_day", et en supprimant les enregistrements existants de "onduleurs".

Les tables de données sont comme suit:

| timestamp | timestamp | No | CURRENT_TIMESTAMP 
| inverter | int(11) | No | 
| wh   | int(11) | No | 
| dcp  | int(11) | No | 
| dcc  | float  | No | 
| efficiency | float  | No | 
| acf  | int(11) | No | 
| acv  | float  | No | 
| temp  | float  | No | 
| status  | int(11) | No | 

Exemple de données:

|2016-01-08 08:34:24|110134878|889901|0|0.05|0|49|55|2|1 
|2016-01-08 08:34:59|110134878|889901|0|0.05|0|49|55|2|1 
|2016-01-08 08:35:23|110048316|643076|0|0.05|0|49|55|1|1 

Inverter_day est une duplication de l'un au-dessus, la structure de la même.

désolé, j'ai oublié d'ajouter le code que j'ai essayé.

if ($sql = mysqli_query ($conn, "SELECT COUNT (*) FROM logs WHERE timestamp < NOW() - INTERVAL 15 MINUTES")) { 
    $row_slt = mysqli_num_rows($sql); 
    if ($row_slt > 0) { 
     $sql = mysqli_query ($conn, "INSERT INTO inverter_day (timestamp, inverter, wh, dcp, dcc, efficiency, acf, acv, temp, status) SELECT timestamp, inverter, wh, dcp, dcc, efficiency, acf, acv, temp, status FROM logs WHERE timestamp NOT IN (select timestamp from inverter_day)"); 
    } else if ($row_slt == 0) { 
     echo "<br> The Tables are up to date <br>"; 
    } else { 
     echo "<br> Oops something went wrong. Please try again"; 
    } 
} 
+1

Bienvenue sur Stack Overflow! Pour vous aider efficacement, nous aurions besoin d'un peu plus de détails sur vos systèmes. Cela aiderait si vous avez posté vos structures de table (telles que la sortie de 'SHOW CREATE TABLE nom_table'). En outre, un petit ensemble de lignes d'échantillons représentatifs des tables concernées. Vos tables contiennent-elles des colonnes datetime/timestamp? S'il vous plaît modifier votre message original ci-dessus pour inclure des informations sur la base de données, merci. –

+0

'L'espace' est bon marché. Et vos données d'exemple sont à peine grandes. Vous pourriez avoir des millions de lignes de cette taille et les stocker sur un lecteur qui pourrait tenir dans un ordinateur portable. – user3741598

+0

@ user3741598 Travailler sur un Pi de framboise, et limité à une carte SD de 16 Go. c'est aussi un "échantillon" des données. – Noah

Répondre

0

Comme je ne l'ai pas eu d'aide supplémentaire à cela, je suis allé sur et à gauche derrière cette partie, jusqu'à ce que je suis tombé sur la fonction INSERT SELECT.

La solution au problème est l'utilisation de:

$query = "INSERT INTO enecsys_day (id, wh, dcpower, dccurrent, efficiency, acfreq, acvolt, temp, state) SELECT id, SUM(wh), SUM(dcpower), SUM(dccurrent), SUM(efficiency), SUM(acfreq), SUM(acvolt), SUM(temp), SUM(state) FROM enecsys GROUP BY id HAVING COUNT(id) > 1"; 

Le code complet i utilisé:

<?php 
       mysql_connect($servername,$username,$password); 
       mysql_select_db($database); 
       $query = "INSERT INTO enecsys_day (id, wh, dcpower, dccurrent, efficiency, acfreq, acvolt, temp, state) SELECT id, SUM(wh), SUM(dcpower), SUM(dccurrent), SUM(efficiency), SUM(acfreq), SUM(acvolt), SUM(temp), SUM(state) FROM enecsys GROUP BY id HAVING COUNT(id) > 1"; 
       $resultaat = mysql_query($query); 
       while ($row = mysql_fetch_array($resultaat)) 
       { 
      ?> 
      <tr> 
       <td><?php $row["id"]; ?></td> 
       <td><?php $row["SUM(wh)"]; ?></td> 
      </tr> 

      <br /> 
      <?php 

     } 


$delete = "DELETE FROM enecsys"; 
$dresultaat = mysql_query($delete); 

      ?>