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

    MYSQL: cancellare record e correggere i successivi

    Ho una tabella con tanti record in questo modo.

    id, nome, start, end
    1, primo, 2010-10-14 15:00:00,2010-10-14 15:01:59
    2, secondo, 2010-10-14 15:02:00,2010-10-14 15:03:59
    3, terzo, 2010-10-14 15:04:00,2010-10-14 15:05:59
    4, primo, 2010-10-14 15:06:00,2010-10-14 15:07:59
    5, secondo, 2010-10-14 15:08:00,2010-10-14 15:09:59
    6, terzo, 2010-10-14 15:10:00,2010-10-14 15:11:59
    7, primo, 2010-10-14 15:12:00,2010-10-14 15:13:59
    8, secondo, 2010-10-14 15:14:00,2010-10-14 15:15:59
    9, terzo, 2010-10-14 15:16:00,2010-10-14 15:17:59
    10, primo, 2010-10-14 15:18:00,2010-10-14 15:19:59
    11, secondo, 2010-10-14 15:20:00,2010-10-14 15:21:59

    ...
    720, terzo, 2010-10-15 14:58:00, 2010-10-15 15:59:59

    In pratica i valori si ripetono fino a saturare le 24 ore.

    Ad un certo evento io devo cancellare tutti i record con un determinato nome dalla tabella, ma devo mantenere il numero dei record rimanenti.

    per cui:
    DELETE FROM tabella WHERE nome = 'secondo' AND start >= NOW()

    Io adesso vorrei che i restanti valori collassassero nei tempi dei valori eliminati e che i record mancanti venissero occupati dai record restanti...

    Avete idee, io ci sbatto la testa ma non vado avanti.
    Ciao!

  2. #2
    chiarisimo

    fa' un esempio del prima e del dopo

  3. #3
    Facciamo che dopo aver eliminato terzo dalla tabella io abbia:


    DELETE FROM tabella WHERE nome = 'secondo' AND start >= NOW()


    id, nome, start, end
    1, primo, 2010-10-14 15:00:00,2010-10-14 15:01:59
    2, secondo, 2010-10-14 15:02:00,2010-10-14 15:03:59
    3, terzo, 2010-10-14 15:04:00,2010-10-14 15:05:59 --> ho il mio evento per cui da qui in avanti elimino tutti i terzo
    4, primo, 2010-10-14 15:06:00,2010-10-14 15:07:59
    5, secondo, 2010-10-14 15:08:00,2010-10-14 15:09:59
    --> manca terzo
    7, primo, 2010-10-14 15:12:00,2010-10-14 15:13:59
    8, secondo, 2010-10-14 15:14:00,2010-10-14 15:15:59
    --> manca terzo
    10, primo, 2010-10-14 15:18:00,2010-10-14 15:19:59
    11, secondo, 2010-10-14 15:20:00,2010-10-14 15:21:59
    --> mancano tutti i terzo
    ...
    719, secondo, 2010-10-15 14:56:00, 2010-10-15 15:57:59

    In pratica la riga 7 dovrebbe diventare: 7, primo, 2010-10-14 15:10:00, 2010-10-14 15:11:59
    e cosi via, per ognuno dei record successivi.

    poi, ipotizziamo che le righe rimanenti arrivino fino alle 14.30 del 2010-10-15, io vorrei aggiungere, partendo dalla riga successiva le righe mancanti per arrivare comunque alle 14:59:59
    Ciao!

  4. #4
    Utente di HTML.it L'avatar di Mashin
    Registrato dal
    Jul 2010
    Messaggi
    187
    Tutto via solo sql ? Passo non mi viene in mente nulla.

  5. #5
    anche no... forse può andare in php?
    Ciao!

  6. #6
    Utente di HTML.it L'avatar di Mashin
    Registrato dal
    Jul 2010
    Messaggi
    187
    ahem php passo di nuovo

    cmq tra start ed end passano sempre e solo 2 minuti ? o hai scritto cosi' per fare 1 esempio ? E' cmq un valore fisso come incremento o puo' variare ?
    Chiedo per raccogliere piu' info e facilitare un po' il compito a chi magari ti sa dare na zampa

  7. #7
    passa sempre un valore fisso, che può variare, ma mai nella stessa interrogazione

    diciamo che al momento è 2 minuti, ma potrebbe diventare 3 o 4.
    Ma mai 2,3 o 4 insieme in una giornata.
    Ciao!

  8. #8
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Mi butto
    protocodice
    codice:
    SELECT start FROM tabella WHERE id=3 #il primo record
    -> PHP
    $data = $riga['start'];
    codice:
    DELETE FROM tabella WHERE nome ='terzo' AND start > $data
    collasso?
    codice:
    UPDATE tabella SET start = FROM_UNIXTIME((UNIX_TIMESTAMP(start)-120)) WHERE start > $data
    così però le collassa tutte e non solo il record successivo a quelli cancellati

  9. #9
    il problema è che cosi, cancelli solo il primo buco, ma lasci tutti gli altri...
    Ciao!

  10. #10
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Originariamente inviato da fmortara
    il problema è che cosi, cancelli solo il primo buco, ma lasci tutti gli altri...
    no, effettivamente l'update lo farà anche su alcune che non ti interessanto:
    codice:
    4, primo, 2010-10-14 15:06:00,2010-10-14 15:07:59
    5, secondo, 2010-10-14 15:08:00,2010-10-14 15:09:59
    7, primo, 2010-10-14 15:12:00,2010-10-14 15:13:59
    8, secondo, 2010-10-14 15:14:00,2010-10-14 15:15:59
    10, primo, 2010-10-14 15:18:00,2010-10-14 15:19:59
    11, secondo, 2010-10-14 15:20:00,2010-10-14 15:21:59
    719, secondo, 2010-10-15 14:56:00, 2010-10-15 15:57:59
    WHERE start > $data dove $data è la data della riga con id=3.
    tu invece vuoi da id=6 in poi, giusto?
    quindi:
    codice:
    UPDATE tabella SET start = FROM_UNIXTIME((UNIX_TIMESTAMP(start)-120)) 
    WHERE start >= (SELECT data FROM tabella WHERE nome='terzo' ORDER BY data ASC LIMIT 1,1) 
    #la subquery restituisce la data del record con id =6 nel tuo esempio
    e dopo fai il delete
    codice:
    DELETE FROM tabella WHERE nome ='terzo' AND id!=3
    non ho ben chiaro se l'id 3 deve rimanere...

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.