Newsgroup: it.comp.www.php
Titolo: query [ per esperti ]

Avevo proposto questo post su un' altro ng, ma nessuno mi ha saputo o voluto
dare
risposta, sembra una cavolata ma non č cosě, ho cercato un' intera giornata,
senza trovare soluzione, con un DB che sopporta le subquery č facile, con
mysql non riesco a trovare soluzioni, mi rivolgo a voi che magari avete gia
affrontato questo rompicapo, per me resta un enigma
la tabella "er_piu" ha solo 4 colonne
id | zona | cliente | ordini
------------------------------------
1     N      alex            8
2     N      marco         2
3     S       paolo         1
4     C       luca           10
5     C      mara           9
6     S       ciro            7
zona contiene sempre solo tre record identici " N , C , S "
io vorrei sapere il nome del cliente che ha effettuato la maggior parte
delle ordinazioni per zona,
in pratica solo tre righe
il risultato della query dovrebbe essere
cliente         zona              ordini
---------------------------------------
alex              N                  8
luca              C                 10
ciro               S                  7
usando codesta query
======================
Select  cliente, zona, max(ordini) as ordini
from er_piu
group by zona
=====================
ottengo questo risultato
cliente         zona              ordini
---------------------------------------
luca              C                 10
alex              N                  8
paolo            S                  7
non riesco a capire come mai luca e alex sono giusti e perchč viene
segnalato paolo che
ha effettuato una sola ordinazione e non ciro che ne ha fatte 7 ?
La cosa ridicola che l' applcazione non č stata sviluppata da me e sono 2
anni che ha
segnalato sempre risultati errati, e mai nessuno se ne era accorto, perchč
in fondo si
tratta di pescare il cliente piů fedele, per assegnarli un premio
HAAA.....!!!
Quest' anno il premio se l' č beccato uno che ha fatto '0' ordinazioni. A
titolo di esempio
ho ridotto il nr. delle righe e delle colonne, l' errore si verifica in
tutti i casi,
qualche consiglio ?

 qualche consiglio ?
Premettendo che MySQL al momento non supporta alcune delle
funzionalita' di SQL-92 necessarie per implementare direttamente una
query del genere suggerisco un approccio via codice:
Effettui una query raggruppando per zona e MAX (ordini) e per ognni
risultato effettui una query del tipo WHERE ordini = $ordini AND zona =
$zona (con $ordini e $zona riferiti al record su cui stai ciclando).
Teni presente che potrebbe accadere che alcune zone presentino piu' di
un "vincitore".
Un altro approccio potrebbe essere quello di una query con GROUP BY
zona, cliente ORDER BY zona, Max(ordini) DESC;
Ciclando tra i risultati tieni a mente la precedente zona e tieni come
buono solo il primo record o solo quei record che a parita' di zona
hanno lo stesso valore di ordini (MAX (ordini)).
Entrambe le soluzioni funzionano, probabilmente la seconda risulta
essere piu' performante.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/1
Inviare email con allegati? 
http://url.repository.biz/go/1Z
Cerchi un programmatore PHP/MySQL? 
http://url.repository.biz/go/1Y
L'uomo, conscio di sbagliare, persevera.

 Avevo proposto questo post su un' altro ng, 
....
Ti ho appena postato la soluzione su it.comp.software.database
Bye
gpb

 Ti ho appena postato la soluzione su it.comp.software.database
Complimenti per la soluzione, veramente elegante.


 Complimenti per la soluzione, veramente elegante.
Grazie! Da te fa molto piacere!
gpb

Geniale, quindi avevo ragione che non era cosě semplice come magari tanti
pensavano,
un' altra soluzione esilarante che mi hanno postato su un NG tedesco, sa
quasi dell' incredibile
sento il dovere di postarla, non č cosě raffinata, mi fornisce solo tre
risultati, senza considerare il fatto
che ci possono essere piů vincitori della stessa zona, ma in fondo i premi a
disposizione sono solo tre
=====================
select e.zona,
SUBSTRING(   MAX ( CONCAT( LPAD(e.ordini,6,'0'),e.cliente) ), 7) as client,
0+LEFT( MAX ( CONCAT( LPAD(e.ordini,6,'0'),e.cliente) ), 6) as ordine
from er_piu e
group by   e.zona
order by e.ordini desc
=====================