Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    192

    Mysql - difficoltà con query

    Ciao a tutti,
    ho provato per diverse ore a fare la query ma ne esco pazzo....

    ho una tabella di questo tipo:

    gruppo articolo datavariazione prezzo

    ortaggi cavoli 01-01-2008 10€
    ortaggi cavoli 01-02-2008 12€
    ortaggi carote 01-03-2009 3€
    ortaggi carote 01-06-2009 6€
    ortaggi carote 01-02-2008 4€
    ortaggi cavoli 01-04-2009 7€
    ortaggi carote 01-02-2010 9€
    frutta mele 01-06-2009 10€
    frutta mele 01-05-2009 8€

    abbiamo cioè una tabella nella quale vengono inseriti dei prezzi con la relativa data di validita. Nel momento in cui il prezzo di quel determinato articolo cambia viene inserito un altro record di quell'articolo indicando la data del cambiamento. Si suppone che il prezzo di un determinato articolo si mantenga costante tra una data di cambiamento e l'altra.

    Problema:stabilita un CERTA DATA filtrare dalla tabella gli articoli con relativo prezzo VIGENTE IN QUELLA CERTA DATA.
    Nel caso dell'esempio se fissassi la data 5-5-2009 la lista dovrebbe essere:

    ortaggi cavoli 01-04-2009 7€
    ortaggi carote 01-03-2009 3€
    frutta mele 01-05-2009 8€

    come posso fare una query del genere?

    Nico

  2. #2
    premesso che la data deve essere in formato ansi e cioe' yyyy-mm-dd, dovresti cercare il max(id) dei record dove la data e' inferiore a quella da cercare raggruppando per articolo.

    Esempio (con la massima delle riserve....)

    codice:
    select * from tab
    where id_tab IN(select max(id_tab) from tab
                       where datavariazione < '$data_riferimento'
                       group by prodotto)
    Quindi devi avere un id chiave primaria auto increment, le date memorizzate e quelle di confronto in formato ansi.

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

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    192
    Ciao,
    per le date si certo che devono essere in formato ansi...le ho scritte così ma sul db sono ovviamente rovesciate. Ho il campo id contatore....ma, devo dirti, che l'id non sempre è "fedele" alla data, nel senso che la data può venire anche modificata dopo che è stato inserito il record, nel caso uno si accorgesse che ha sbagliato ecc.....quindi l'ideale sarebbe poter ragionare (non so come) proprio sul valore della data stessa e trovare per ogni articolo quello PIU PROSSIMO che ha data <= della data di riferimento......

  4. #4
    Non dovrebbe costituire un problema, se la data e' piu' recente del riferimento non viene considerata, se minore scegliera' il max id relativo a data minore e prodotto.

    Potrebbe essere un errore solo se aggiorni prezzo e data di un vecchio record (UPDATE) ottenendo quindi un record "fasullo" nel senso di data e prezzo aggiornati su un precedente id.

    Diversamente dovresti selezionare anche il prodotto oltre alla data senza cercare il raggruppamento, ordinando la data DESC e limitando al primo risultato ottenuto. Esempio:

    codice:
    select *
    from tabella
    where datavariazione <= '$data_riferimento'
    AND prodotto = '$prodotto'
    order by datavariazione desc
    limit 1

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

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    192
    ...possono venire aggiornati vecchi id ed ottenere record "fasulli". L'ultimo esempio che hai fatto andrebbe bene ma non mi occorre riferirlo ad un solo prodotto alla volta...devo ottenere un elenco di tutti i prodotti, con una unica query, la cui data di variazione è la piu prossima <= alla data di riferimento......ottenere cioè una specie di "listino" vigente a quella data di riferimento.

  6. #6
    codice:
    SELECT *
    FROM tabella
    WHERE datavariazione <= '$data_riferimento'
    GROUP BY prodotto
    ORDER BY datavariazione DESC
    Ciao!

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    192
    Ho eseguito la query di fmortara dapprima senza il group by per prodotto e vedo effettivamente i prodotti a "pacchetti" ordinati per prodotto e datavariazione descrescente.......il primo record di ognuno questi pacchetti prodotto sarebbe quello che mi interessa....solo che...quando applico il group by , pur essendo ordinati per prodotto e datavariazione DESC, non prende questo "primo" ma, nell'ambito del prodotto, considera un altro record......forse random...

  8. #8
    Originariamente inviato da nikotina
    Ho eseguito la query di fmortara dapprima senza il group by per prodotto e vedo effettivamente i prodotti a "pacchetti" ordinati per prodotto e datavariazione descrescente.......il primo record di ognuno questi pacchetti prodotto sarebbe quello che mi interessa....solo che...quando applico il group by , pur essendo ordinati per prodotto e datavariazione DESC, non prende questo "primo" ma, nell'ambito del prodotto, considera un altro record......forse random...
    non e' random, e' un limite nell'uso del distinct e del group by. Non servono per "prendere" uno specifico record ma il "primo" record che fisicamente incontra nella tabella e che soddisfa il raggruppamento. Quindi serve per le funzioni di raggruppamento e non per le liste.

    E' poi questa la ragione per cui ti avevo impostato la prima query che tu ritieni (giustamente) non soddisfare le tue esigenze per via di record "taroccati".

    Questo dei record taroccati, dal punto di vista mio, e' un errore di impostazione del progetto. Se un record e' errato oppure scaduto si cancella oppure si abbandona per un altro piu' aggiornato.
    Se e' scaduto va mantenuto per un eventuale storico, ma se sbagliato all'inserimento lo correggo e basta. Mantiene l'id e la data e correggo il prezzo. Non ha senso la correzione della data e tanto meno cambiare il significato dell'id.
    Se la data e' errata ma il prezzo e' giusto il record va cancellato altrimenti genera confusione (mancata sequenza temporale degli id).
    L'id "deve" essere progressivo nel tuo caso perche' utilizzi solo una data di inizio e non hai una data di scadenza ed in piu' le date sono comunque progressive in modo random (nel senso senza precisa scadenza) per una varieta' di prodotti non identificabili dalla data.

    L'id ti serve per pescare esattamente "quell'ultima" data prima del tuo riferimento senza dover pescare record randomized od avere una lista di risposte da selezionare.

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

  9. #9
    codice:
    SELECT * FROM tabella
    WHERE datavariazione IN (
        SELECT MAX(datavariazione) FROM tabella
        WHERE datavariazione < '$data_riferimento'
        GROUP BY prodotto
    )
    Hai provato questa?
    Ciao!

  10. #10
    codice:
    SELECT * FROM tabella
    WHERE datavariazione IN (
        SELECT MAX(datavariazione) FROM tabella
        WHERE datavariazione < '$data_riferimento'
        GROUP BY prodotto
    )
    Hai provato questa?
    L'id potresti anche non averlo!
    Ciao!

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.