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

    [MySql] - tutto in una sola query

    Ciao a tutti, scusate se non sono riuscito a scrivere un titolo piu chiaro, ma io stesso non ho le idee chiare sulla query da eseguire.

    Cerco di essere il piu breve possibile:

    ho una sola tabella con 3 campi: id, nominativo, oggetto, data

    quindi, tante persone, che possono avere uno o piu oggetti (una riga per ogni coppia nominativo-oggetto) e relativa data (di acquisto)

    mi interessa prendere 5 persone (quindi DISTINCT di nominativo con limit 0,5) e per ogni persona verificare se ha l'oggetto "telefono" e, se si, mostrare la data dell' ULTIMO acquisto (puo essere che ha acquistato 3 telefoni... a me interessa sapere solo quando ha acquistato l'ultimo)

    se non ha l'oggetto "telefono", mostrare la data vuota

    esempio di un possibile output:

    tizio | 2012-01-10
    caio | 2012-03-04
    sempronio |
    pinco | 2011-07-05
    pallino |

    E' difficile o sono io davvero scarso?

  2. #2
    lo puoi fare usando la funzione di aggregazione MAX sulla data e raggruppando per nominativo e oggetto

    SELECT nominativo, oggetto, MAX(data)
    FROM ...
    WHERE ...
    GROUP BY nominativo, oggetto

  3. #3
    Originariamente inviato da nicolabiondo
    lo puoi fare usando la funzione di aggregazione MAX sulla data e raggruppando per nominativo e oggetto

    SELECT nominativo, oggetto, MAX(data)
    FROM ...
    WHERE ...
    GROUP BY nominativo, oggetto
    E' QUASI giusto!
    In realtà il problema (e forse non l'avevo spiegato bene al primo post) è che devo far vedere la data di acquisto (MAX) dell'oggetto telefono SOLO SE è stato acquistato un telefono. Ma potrebbe essere stato acquistato un computer, e in questo caso il campo data deve risultare vuoto (null o "")
    Quindi non posso mettere nel WHERE una condizione del tipo oggetto="telefono" perche cosi mi farebbe vedere solo le persone che hanno preso un telefono.

    Ora come ora, lo sto facendo fare in PHP... un ciclo for di cardinalità della select e per ogni ciclo un'ulteriore query per verificare se l'utente ha l'oggetto ecc...ecc...

  4. #4
    codice:
    select
            nominativo
    	case 
    		when oggetto='telefono' then max(data)
    		when oggetto<>'telefono' then null
    	end
    from ...
    group by nominativo,oggetto

  5. #5
    Originariamente inviato da nicolabiondo
    codice:
    select
            nominativo
    	case 
    		when oggetto='telefono' then max(data)
    		when oggetto<>'telefono' then null
    	end
    from ...
    group by nominativo,oggetto
    Decisamente meglio, ma ancora non completamente funzionale.

    Adesso vengono visualizzati i nominativi tante volte la cardinalità degli oggetti acquistati.
    Anche impostando un DISTINCT sul nominativo, se l'utente ha acquistato 1 telefono e 1 televisore, mi esce una riga con la data (quella relativa all'acquisto del telefono) e una riga con data NULL (che è il raggruppamento di tutti gli oggetti acquistati diversi dal telefono)

    L'idea base, invece, è quella di avere PRIMA un elenco di 5 persone distinte (prese, per esempio, con il nome che inizia con "rob") e di queste 5 persone sapere l'ultima volta che hanno acquistato un telefono (se non hanno acquistato un telefono, la data è null)

  6. #6
    devi usare
    SELECT TOP 5
    ...
    WHERE nominativo like 'rob%'

  7. #7
    Originariamente inviato da nicolabiondo
    devi usare
    SELECT TOP 5
    ...
    WHERE nominativo like 'rob%'
    mmm... forse ti riferisci alla clausola LIMIT? (sto usando MySql)

    se è quella, gia la usavo... ma il risultato è sempre lo stesso: si crea un "duplicato" nel risultato...

    posto il codice:

    codice:
    select
            distinct(nominativo),
    	case 
    		when oggetto='telefono' then max(data)
    		
    	end
    from acquisti
    where nominativo like '%rob%'
    group by nominativo,oggetto limit 5
    se invece di "rob" cerco l'utente completo (esempio mario rossi) esce fuori qualcosa del tipo:

    codice:
    nominativo       case when oggetto='telefono' then max(data) end
    MARIO ROSSI	2012-08-06 12:04:40
    MARIO ROSSI	NULL

  8. #8
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da gasparirob
    mmm... forse ti riferisci alla clausola LIMIT? (sto usando MySql)

    se è quella, gia la usavo... ma il risultato è sempre lo stesso: si crea un "duplicato" nel risultato...

    posto il codice:

    codice:
    select
            distinct(nominativo),
    	case 
    		when oggetto='telefono' then max(data)
    		
    	end
    from acquisti
    where nominativo like '%rob%'
    group by nominativo,oggetto limit 5
    se invece di "rob" cerco l'utente completo (esempio mario rossi) esce fuori qualcosa del tipo:

    codice:
    nominativo       case when oggetto='telefono' then max(data) end
    MARIO ROSSI	2012-08-06 12:04:40
    MARIO ROSSI	NULL
    Entro nella discussione,
    dimmi se è questo quello che cerchi:
    codice:
    SELECT a1.nominativo,
    	CASE
    		WHEN a1.oggetto = 'telefono' then a1.data
    		ELSE NULL
    	END
    FROM acquisti a1
    WHERE NOT EXISTS
    	(SELECT 'x' FROM acquisti a2
    	WHERE a2.nominativo = a1.nominativo
    	AND a2.data > a1.data)

  9. #9
    Originariamente inviato da Joe Taras
    Entro nella discussione,
    dimmi se è questo quello che cerchi:
    codice:
    SELECT a1.nominativo,
    	CASE
    		WHEN a1.oggetto = 'telefono' then a1.data
    		ELSE NULL
    	END
    FROM acquisti a1
    WHERE NOT EXISTS
    	(SELECT 'x' FROM acquisti a2
    	WHERE a2.nominativo = a1.nominativo
    	AND a2.data > a1.data)
    Benvenuto nella discussione innanzitutto!

    Premetto che non ho assolutamente capito il senso della query... poco importa... l'ho provata... modificata quel tanto che basta per rendermi conto se i risultati sono giusti... e... no, i risultati non sono giusti.
    Premetto di aver ristretto le condizioni aggiungendo un "nominativo LIKE '%rob%' alla clausola WHERE (ottenendo cosi: WHERE nominativo LIKE '%rob%' AND NOT EXISTS ecc....)

    Si verificano però due problemi:
    1) compaiono piu volte le stesse persone (un record in cui la data è null, un record in cui c'è la data, un altro record ancora in cui la data è null... tutto a parità di nominativo)
    2) un nominativo per il quale so che ha acquistato un telefono (anzi, piu di uno) compare data null


  10. #10
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da gasparirob
    Benvenuto nella discussione innanzitutto!

    Premetto che non ho assolutamente capito il senso della query... poco importa... l'ho provata... modificata quel tanto che basta per rendermi conto se i risultati sono giusti... e... no, i risultati non sono giusti.
    Premetto di aver ristretto le condizioni aggiungendo un "nominativo LIKE '%rob%' alla clausola WHERE (ottenendo cosi: WHERE nominativo LIKE '%rob%' AND NOT EXISTS ecc....)

    Si verificano però due problemi:
    1) compaiono piu volte le stesse persone (un record in cui la data è null, un record in cui c'è la data, un altro record ancora in cui la data è null... tutto a parità di nominativo)
    2) un nominativo per il quale so che ha acquistato un telefono (anzi, piu di uno) compare data null

    Allora,
    la query che ti ho scritto estrae dello stesso nominativo gli ultimi acquisti e ti visualizza la data solo se l'oggetto è telefono.

    Da quello che mi hai scritto sembrerebbe che il campo data sul tuo DB è di per se NULL, diversamente non mi spiego come mai non esca il risultato.

    In parole povere:
    codice:
    SELECT a1.nominativo,
    	CASE
    		WHEN a1.oggetto = 'telefono' then a1.data
    		ELSE NULL
    	END
    FROM acquisti a1
    WHERE NOT EXISTS
    	(SELECT 'x' FROM acquisti a2
    	WHERE a2.nominativo = a1.nominativo
    	AND a2.data > a1.data)
    La query che ti ho scritto fa la seguente cosa:
    Prendi gli acquisti per cui fissato un nominativo (a1.nominativo) non ci siano altri acquisti (NOT EXISTS) legati allo stesso nominativo in data successiva (a2.data > a1.data).
    Si, se vuoi condizionare solo su %rob% è giusto mettere in AND la NOT EXISTS.

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.