Visualizzazione dei risultati da 1 a 6 su 6

Discussione: MySQL e sottoquery

  1. #1

    MySQL e sottoquery

    Ho una tabella con tre campi, ID - Testo - Data, con ID che è indice autoincrementante e Data in cui si mette il time; prima di inserire dati devo cancellare tutti i record che , in ordine cronologico, sia oltre il 50° posto, per cui avevo pensato ad una sottoquery fatta così

    DELETE FROM TABELLA WHERE NOT ID IN (
    SELECT ID FROM TABELLA ORDER BY Data DESC LIMIT 0,50
    )
    ma la versione di MYSQL (4.1) non accetta IN come clausola per sottoquery.
    Non mi rimane altro che fare un ciclo e cancellare ad una a una le righe?
    Grazie

  2. #2
    già...

  3. #3
    Se devi cancellare i piu' vecchi e tenere solo gli ultimi 50, basta che fai la conta totale, ordini per asc e metti LIMIT (num_tot - 50)

    SELECT COUNT(*) as tot FROM TABELLA

    if($row['tot'] > 50) { $tot = $row['tot'] - 50;
    DELETE FROM TABELLA ORDER BY DATA ASC LIMIT $tot }

    fai una prova prima di usare DELETE con una SELECT per vedere se cancelli solo quello che vuoi.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Grazie mille: non ci avevo pensato. Peccato però che non sia elegante come la sottoquery. Ma la versione di MySQL che supporta sottoquery come quella che vorrei io qual'è.Ciao e grazie ancora

  5. #5
    Ho fatto così:


    $result = mysql_query("SELECT COUNT(*) as tot FROM PI_REFERER");
    while ($row=mysql_fetch_array($result)) {
    if($row["tot"] > 5) {
    $tot = $row['tot'] - 5;
    $result = mysql_query("DELETE FROM PI_REFERER ORDER BY DATA ASC LIMIT $tot");
    }
    }

    e cancella come si deve, mandandomi però
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhost/portaleitalia/myasg/stats.php on line 7
    perché?

  6. #6
    codice:
    $result = mysql_query("SELECT COUNT(*) as tot FROM PI_REFERER") OR DIE(mysql_error());
     
    $row = mysql_fetch_assoc($result);
    
    if($row["tot"] > 5) { 
         $tot = $row['tot'] - 5; 
         $result = mysql_query("DELETE FROM PI_REFERER 
                                ORDER BY DATA ASC LIMIT $tot"); 
    }
    Aggiungi la segnalazione di errore e non serve il while perche' rende una sola riga.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.