Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    cancellazione record "eccessivi"

    ciao a tutti,

    ho una tabella mysql così articolata
    1) id (INT 11 e AUTO INCREMENT);
    2) campo1 (TEXT 30);
    3) campo2 (TEXT 30);
    4) campo3 (TEXT 30);
    5) numero (?????); ---------> QUI STA IL PROBLEMA

    In pratica nel campo "numero" vorrei inserire qualche valore o non sò cosa in modo tale che nel database rimangono salvati SOLO GLI ULTIMI 100 RECORD INSERITI MENTRE VENGANO CANCELLATI QUELLI ECCEDENTI PIU' "VECCHI".

    Se questa alternativa non fosse perseguibile/semplice mi "accontenterei" anche di cancellare i record più vecchi di 3 giorni (ad esempio).

    La domande che pongo sono dunque:
    A)cosa dovrei inserire nel campo numero (se è necessario)?
    B)come impostare la query.

    Grazie in anticipo per le risposte.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Visto che hai una chiave primaria, gli ultimi 100 record saranno quelli con l'id maggiore.
    Quindi per rimuovere i record più datati ti basta fare:

    codice:
    delete from tabella where id < (select * from (select id from tabella order by id desc limit 100,1) as tab)
    Per precauzione prova la query su una copia di sicurezza della tabella.

  3. #3
    Non penso che si possa fare semplicemente col campo numero.

    Senza aiutarti con PHP, quindi volendo fare tutto con un paio di query, dovresti fare una select count in cui ottieni il numero totale di record, sottrai 100 e fai un'altra query di questo tipo:
    DELETE FROM tabella ORDER by id ASC LIMIT [numero ottenuto prima]

    Ciao

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da nicola75ss
    Visto che hai una chiave primaria, gli ultimi 100 record saranno quelli con l'id maggiore.
    Quindi per rimuovere i record più datati ti basta fare:

    codice:
    delete from tabella where id < (select * from (select id from tabella order by id desc limit 99,1) as tab)
    Per precauzione prova la query su una copia di sicurezza della tabella.
    C'era una svista.

  5. #5
    ma questo tipo di query funziona anche se il campo id ha dei "buchi"?

    mi spiego meglio: prima che i record vengono cancellati automaticamente con la query che sto richiedendo in questo topic, può capitare che un singolo record lo possa eliminare anche con una query specifica.

    ad esempio: voglio salvare gli ultimi 100 record inseriti ma eventualmente voglio cancellare il terzultimio...

  6. #6
    per salvare solo i record inseriti nelle ultimi tre gioni ho pensato di fare così... ma non sò se esatto... quindi chiedo il vostro parere.

    In pratica ad ogni inserimento nel db inserisco nel campo "time" il time() e contestualmente all'inserimento faccio la cancellazione dei recod il cui time è inferiore a
    time()-259200 dove 259200 vien fuori da: 3*24*60*60 cioè 3 giorni * 24 ore * 60 minuti * 60 secondi (cioè i secondi che formano tre giorni).

    E corretto? oppure c'è qualcosa che nn và?

    Codice PHP:
    <?php
    $campo1
    =addslashes($_POST['campo1']);
    $campo2=addslashes($_POST['campo2']);
    $campo3=addslashes($_POST['campo3']);
    $time=time();


    include (
    "conn.php");
    global 
    $db_host$db_user$db_password$db_database;

    $db_tabella "nome_tabella";
    $connessione mysql_connect($db_host,$db_user,$db_password) or die ("connessione non riuscita");

    /***QUERY DI INSERIMENTO*/
    $query1="insert into ".$db_tabella."(campo1, campo2, campo3, time) values('".$campo1."', '".$campo2."', '".$campo3."', '".$time."')"
    mysql_db_query($db_database,$query1,$connessione);

    /***QUERY DI CANCELLAZIONE*/
    $query2="delete from ".$db_tabella." where time<".$time-259200."";        
    mysql_db_query($db_database,$query2,$connessione);

    ?>

  7. #7

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Per cancellare i record più vecchi di tre giorni ti basta fare


    delete from tabella where time < curdate() - interval 3 day

    Time è una delle parole riservate che comunque è possibile utilizzare come nome di campo senza bisogno di racchiuderla tra backtick ma sarebbe preferibile a scanso di equivoci, rinominarlo.

  9. #9
    ok capito... in pratica devo:
    1) rinominare il campo (esempio "timer")
    2) modificare la query delete

    ma cmq... la "logica" andava bene.... giusto?

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Sì, semplicemente non c'è bisogno di fare quei calcoli visto che le funzioni di mysql di gestione delle date bastano e avanzano.

    Se ti va leggiti queste pillole di piero.mac, datate ma sempre utilissime.

    http://forum.html.it/forum/showthrea...hreadid=459634
    http://forum.html.it/forum/showthrea...hreadid=839754

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.