Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Query su singola tabella

    Salve,
    ho una tabella con circa 70000 record. La tabella ha 14 campi, e i record sono divisi in 4 gruppi in base alle giornate. Ecco un esempio

    codice:
    id nome ... valore data primary_id
    505 Marco .... 500 20130505 4
    803 Gianni .... 400 20130505 8
    ...........
    505 Marco .... 508 20130506 11
    803 Gianni .... 400 20130506 15
    ...........
    505 Marco .... 525 20130507 11
    803 Gianni .... 400 20130507 15
    ...........
    505 Marco .... 560 20130508 11
    803 Gianni .... 400 20130508 15
    Ho uno script php di ricerca che va a selezionare solo i record che non hanno avuto variazioni nel campo "valore", script che nel caso medio esegue circa 100 query.

    Vorrei ottimizzare lo script per evitare di fare tutte queste query per ogni ricerca, e ho pensato di creare una tabella separata contenente tutti gli utenti che non hanno avuto variazioni nel campo "valore".

    Qualche idea? Ho già provato con una join sulla stessa tabella....mai visto il risultato finale, dopo diversi minuti riavvio apache perchè mi si blocca tutto.

  2. #2
    "che non hanno avuto variazioni nel campo "valore" " rispetto a cosa?

  3. #3
    La tabella è aggiornata automaticamente ogni giorno tramite cron.
    Come nell'esempio, l'utente Marco in data 20130505 aveva valore 500, in data 20130506 aveva valore 508, mentre il valore dell'utente Gianni non ha subito variazioni nei diversi giorni. Non sono io a settare i valori, scarico un file .sql che aggiunge tutti i record alla tabella.

    Quindi io vorrei recuperare tutti gli utenti che non hanno subito variazione nel campo valore nelle diverse date.
    Nell'esempio, Marco dovrebbe essere escluso perchè il campo "valore" è diverso nelle diverse date, mentre Gianni dovrebbe essere incluso perchè il suo "valore" è inalterato.

    Spero di essere stato più chiaro.

  4. #4
    quindi che non hanno avuto variazioni in un determinato intervallo di tempo? o solo l'ultimo valore rispetto al valore precedente?

  5. #5
    Il controllo deve essere fatto in 4 giorni, ma giorno per giorno, perchè potrebbe capitare una cosa del genere

    giorno 1 -> valore 500
    giorno 2 -> valore 508
    giorno 3 -> valore 495
    giorno 4 -> valore 500

    In questo caso se prendo le date giorno 1 e giorno 4 sembra non esserci stata variazione, ma in realtà c'è stata.

    Quindi, il controllo è fatto giorno per giorno, ma l'intervallo di tempo è tutti e 4 i giorni.

  6. #6
    quindi, ricapitolando, quei valori che nell'arco di tempo indicato non hanno mai avuto variazioni

  7. #7
    Esatto, devo estrapolare i record che in quell'arco di tempo non hanno avuto variazioni nel campo "valore"

  8. #8
    SELECT ... FROM nome_tabella WHERE utente IN (
    SELECT utente, COUNT(valore) GROUP BY utente, valore HAVING COUNT(valore) = 1
    );
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  9. #9
    Ciao, grazie per la risposta, ma mi è poco chiara...

    La query che mi hai dato contiene qualche errore, tipo
    codice:
    where utente in ( select utente, count(....
    la subquery dovrebbe restituire una sola colonna, non due.

    Oltre a questo, ho provato ad eseguire solo la subquery, e in output mi da solo 13 risultati (quando in media sono almeno 2000), senza tenere in considerazione le date.

  10. #10
    Ciao,
    prova così :

    codice:
    select t1.*
    from tab t1 
    where t1.data between '20130501' and '20130531'
    and not exists (select 1 from tab t2 
                        where t2.data between '20130501' and '20130531'
                           and t2.id=t1.id 
                           and t2.valore <> t1.valore
                     )
    Proverei ad aggiungere un indice su data ed eventualmente
    un'altro univoco su id e data.

    P.S.
    nota che non sono tenuti in conto quanti records ci sono nel periodo
    per un dato id/nome, ovvero , in altre parole,
    se , per un un id/nome , esiste solo un record
    sarà estratto come invariato.

    HTH

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.