Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    55

    Leggere dati più recenti da una tabella [MySQL]

    Ciao a tutti, ho una query che mi tira fuori questi dati in cui dovrei vedere l'ultima volta che il cliente ha acquistato:

    22/07/2013 Cliente 1 Agente 6 Nota 3
    22/07/2013 Cliente 2 Agente 3 Nota 4
    18/07/2013 Cliente 3 Agente 2 Nota 2
    18/07/2013 Cliente 4 Agente 4 Nota 8
    17/07/2013 Cliente 5 Agente 3 Nota 1
    16/07/2013 Cliente 6 Agente 2 Nota 3

    Selezionando il nome del cliente mi rimanda allo storico del cliente stesso:

    18/07/2013 Cliente 4 Agente 5 Nota 1
    02/07/2013 Cliente 4 Agente 2 Nota 2
    20/06/2013 Cliente 4 Agente 6 Nota 5
    04/06/2013 Cliente 4 Agente 3 Nota 4
    22/05/2013 Cliente 4 Agente 3 Nota 7
    07/04/2013 Cliente 4 Agente 4 Nota 8

    Come si può vedere la data effettivamente è la più recente, ma l'agente e le note sono della data più vecchia. Le due query sono queste:

    Lista completa dei clienti
    SELECT MAX(data) AS data, intestazione, esito, note, provincia, nome, codice, citta
    FROM 2013_operazioni
    JOIN co_agente, co_esito, anagrafica
    WHERE cod_agente = c_agente
    AND archiviato = 'N'
    AND cod_cliente = codice
    AND cod_esito = c_esito
    AND acquisti = '1'
    GROUP BY cod_cliente
    ORDER BY data DESC, intestazione

    Lista del cliente scelto
    SELECT data, intestazione, provincia, nome, esito, note, acquisti
    FROM 2013_operazioni
    JOIN co_agente, co_esito, anagrafica
    WHERE cod_agente = c_agente
    AND cod_cliente = codice
    AND cod_esito = c_esito
    AND codice = '$id_cliente'
    ORDER BY data DESC

    Praticamente vorrei che nella lista totale mi desse la data, l'agente e le note dell'ultimo acquisto. Per esempio nel mio caso:

    18/07/2013 Cliente 4 Agente 5 Nota 1
    e non
    18/07/2013 Cliente 4 Agente 4 Nota 8

    A questo punto vi domando: ci sono istruzioni SQL che io non conosco e mi possono tirare fuori i dati che voglio?
    PS: Lavoro con PHP in locale!!!
    Grazie a tutti.....

  2. #2
    non si riesce a capire bene la domanda.
    Hai una serie di campi credo univoci ma solo tu sai a che tabella appartengono.
    Hai anche un modo inusuale di elencare i campi in join. Se utilizzi lo stile theta allora devi elencare tutti i campi in from:

    from 2013_operazioni, co_agente, co_esito, anagrafica
    e le condizioni in where

    se utilizzi lo stile ansi allora devi usare join | inner | left | right | e le condizioni in ON in modo da filtrare via via i record raccolti:

    from 2013_operazioni
    inner join co_agente ON | equi-join |
    inner join co_esito ON ......
    inner join anagrafica ON .....
    where codice = '$id_cliente'

    altra domanda: in quale formato hai la data memorizzata nel db?

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    55
    Grazie per la risposta. Allora non sono un programmatore, e lo stile theta non so nemmeno cosa sia. Lo stesso dicasi dell'ANSI. Il problema non è nella seconda query, quella mi restituisce tutti i dati esatti. Nella prima mi elenca tutti i clienti e la data dell'ultimo acquisto fatto. Fino a qua tutto ok, infatti fatture alla mano posso verificare che il cliente ha acquistato il giorno in cui è stato contattato. Quando vado a controllare chi è che ha contattato il cliente quel giorno, mi risulta un agente diverso da quello che veramente era con lui. Mi rispiego, ma è un'impresa:
    Situazione reale:
    Cliente PIPPO, ultimo acquisto il 22/07/2013 contattato da Gianni.
    Situazione query:
    Cliente PIPPO, ultimo acquisto il 22/07/2013 contattato da Pino.
    Andando a vedere gli acquisti di Pippo da gennaio ad ora, vedo che ha effettuato il primo acquisto il 7/02/2013 ed è stato contattato da Pino per cui la query mi restituisce l'ultima data (infatti MAX mi serve per quello), però come agente e note, mi restituisce quelle del primo acquisto dell'anno in corso. Non so se sono riuscito a spiegarmi comunque ora provo con gli ON come mi hai consigliato. Il campo data è DATE e di default è 0000-00-00. Grazie ancora!!!

  4. #4
    qualcosa in piu' si capisce....

    in pratica con il group by cod_cliente e max data recuperi la data ultima di tale cliente ma non il record corrispondente. Il record che ti viene restituito e' il primo che fisicamente si trova scandendo la tabella e che soddisfa la richiesta (di cod_cliente).

    Si deve individuare l'id del record che contiene la max data di tale cod_cliente e poi recuperare QUEL id record

    id del record, non del cliente. Si puo' ottenere con un subquery ma si deve conoscere la posizione dei campi nelle varie tabelle.

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    55
    Hai centrato il problema. Infatti avevo pensato di recuperare l'id della tabella, ma mi sono arenato alle subquery. Non essendo tanto ferrato in materia ho pensato a chiedere aiuto a voi. Se vuoi ti posto le tabelle, ma mi basterebbe un esempio e poi magari ci ammatisco da solo, ok?

  6. #6
    Originariamente inviato da robiesse
    Hai centrato il problema. Infatti avevo pensato di recuperare l'id della tabella, ma mi sono arenato alle subquery. Non essendo tanto ferrato in materia ho pensato a chiedere aiuto a voi. Se vuoi ti posto le tabelle, ma mi basterebbe un esempio e poi magari ci ammatisco da solo, ok?
    nel where ...

    where ...altre condizioni
    and id = (SELECT MAX(id) FROM Tabella where cod_cliente = '$tuo_cliente')

    oppure
    and data = (SELECT MAX(data) FROM Tabella where cod_cliente = '$tuo_cliente')

    si presume che il max(id) di tale cliente corrisponda anche alla max(data)

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    55
    Allora, intanto ti ringrazio ora la provo e poi ti faccio sapere, ok? Grazie di nuovo, Roberto!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    55
    Ho risolto solo per metà. Questa è la nuova query:

    SELECT MAX(data) AS data, intestazione, esito, note, provincia, nome, codice, citta, id_operazioni
    FROM 2013_operazioni
    JOIN co_agente, co_esito, anagrafica
    WHERE cod_agente = c_agente
    AND archiviato = 'N'
    AND cod_cliente = codice
    AND cod_esito = c_esito
    AND acquisti = '1'
    AND data = (SELECT MAX(data) AS data FROM 2013_operazioni)
    GROUP BY cod_cliente
    ORDER BY data DESC, intestazione


    Mi tira fuori quello che volevo, ma non la data degli ultimi acquisti di tutti i clienti, ma bensì i clienti che hanno acquistato nell'ultima data del database. Mi spiego, io ho 100 clienti e non comprano tutti lo stesso giorno, magari qualcuno ha comprato 10 giorni fa, qualcuno 3 giorni e così via. Se gli ultimi acquisti sono stati fatti il giorno 22 luglio, lui mi restituisce i clienti che hanno acquistato quel giorno lì e non quelli che hanno acquistato i giorni avanti. Ancora un esempio. Questi sono i clienti e la data dei loro acquisti:
    Cliente PIPPO, ultimo acquisto il 22/07/2013 contattato da Gianni.
    Cliente PLUTO, ultimo acquisto il 22/07/2013 contattato da Mario.
    Cliente TOPOLINO, ultimo acquisto il 22/07/2013 contattato da Ugo.
    Cliente QUI, ultimo acquisto il 18/07/2013 contattato da Andrea.
    Cliente QUO, ultimo acquisto il 18/07/2013 contattato da Gianni.
    Cliente QUA, ultimo acquisto il 18/07/2013 contattato da Carlo.
    Cliente MINNI, ultimo acquisto il 16/07/2013 contattato da Mario.
    Cliente PAPEROGA, ultimo acquisto il 16/07/2013 contattato da Ugo.
    Cliente PAPERINO, ultimo acquisto il 16/07/2013 contattato da Gianni.


    La nuova query mi restituisce solo quelli che hanno acquistato il giorno 22, cioè:
    Cliente PIPPO, ultimo acquisto il 22/07/2013 contattato da Gianni.
    Cliente PLUTO, ultimo acquisto il 22/07/2013 contattato da Mario.
    Cliente TOPOLINO, ultimo acquisto il 22/07/2013 contattato da Ugo.



    Io vorrei se possibile, TUTTA la lista dei clienti con l'ultima data che hanno acquistato per poter vedere da quanto tempo è che un cliente non compra. Ho provato anche a sostituire la riga:
    AND data = (SELECT MAX(data) AS data FROM 2013_operazioni)
    con la riga:
    AND data <= (SELECT MAX(data) AS data FROM 2013_operazioni)
    mi restituisce si tutti i clienti, ma le note e gli agenti come nelle query vecchie, cioè sballati.

  9. #9
    prova con:

    codice:
    AND data IN (SELECT MAX(data) AS data 
                        FROM 2013_operazioni 
                        group by cod_cliente)

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    55
    Ho provato a modificare la riga come mi hai consigliato:
    AND data IN (SELECT MAX(data) AS data FROM 2013_operazioni GROUP BY cod_cliente)
    Ho provato anche a togliere il GROUP BY cod_cliente, ma in tutte e due i casi mi entra in loop infinito e non mi da risposta. Ho provato anche:
    AND data BETWEEN '2013-01-01' AND (SELECT MAX(data) AS data FROM 2013_operazioni)
    ma mi da gli stessi risultati di questa riga:
    AND data <= (SELECT MAX(data) AS data FROM 2013_operazioni)
    Sinceramente non so dove sbattere la testa.

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.