277 messaggi dal 13 giugno 2001
Ciao, come realizzare una query per MySql la quale deve estrare solo i record che anno il valore minimo. Faccio un esempio.

Devo poter estrare da una tabella tutti i record dove il valore di tre campi numerici siano i più bassi. Per fare un esempio nel db avrei questi record

1) Articolo1, val1=12,40, val2=12,34, val3=11,00
2) Articolo2, val1=21,40, val2=11,34, val3=13,00
3) Articolo1, val1=11,00, val2=10,00, val3=09,00
4) ....
5) .......

In questo caso la query mi dovrà ritornare solo il record (2) e (3) escludendo (l'1) in quanto uguale come il (3) ma con valori maggiori. Però ad ogni valore (val1-3) mi deve associare anche il campo id (contatore) perche ovviamente puo succedere che ad esempio il val1 minore corrisponda al primo record, mentre il val3 potrebbe corrispondere al record 3 e via di seguito..

Spero che possiate aiutarmi....

Carmen
11.886 messaggi dal 09 febbraio 2002
Contributi
Carmen ha scritto:
deve estrare solo i record che anno il valore minimo


Ciao, ti serve la funzione di aggregazione MIN.

Carmen ha scritto:
puo succedere che ad esempio il val1 minore corrisponda al primo record, mentre il val3 potrebbe corrispondere al record 3 e via di seguito..


Semplifica il problema; la query diventa molto semplice se la esegui su un campo alla volta.

SELECT Id, Articolo, MIN(val1) as ValoreMinimo FROM tabella GROUP BY Articolo;
e poi la ripeti per val2 e val3. Potrai poi riassemblare i 3 resultset secondo le tue necessità.

Oppure, puoi fare in modo che sia MySql ad unirteli mediante una UNION.
SELECT Id, Articolo, MIN(val1) as ValoreMinimo, 1 as Indice FROM tabella GROUP BY Articolo UNION SELECT Id, Articolo, MIN(val2) as ValoreMinimo, 2 as Indice FROM tabella GROUP BY Articolo UNION SELECT Id, Articolo, MIN(val3) as ValoreMinimo, 3 as Indice FROM tabella GROUP BY Articolo;
In questo caso però ho dovuto far generare dinamicamente un campo "Indice" che avrà valore 1, 2 o 3 così da distinguere meglio i risultati generati dalla prima, seconda e terza query.

ciao,
Modificato da BrightSoul il 17 ottobre 2011 20.55 -

Enjoy learning and just keep making
277 messaggi dal 13 giugno 2001
Ciao, io avevo provato così e mi funziona. L'unico problema che non mi torna l'id (contatore) corrispondente ai valori estratti. Come dicevo potrebbe essere che i tre valori minimi siano tutti su un solo record, ed in questo caso tutto ok, ma potrebbe essere ad esempio che val1 e val2 sono identificati in un record, mentre val3 in un altro record. Io avrei bisogno di sapere una cosa del genere:

val1 (r.2)
val2 (r. 2)
val( r. 5)

etc....

Questo perchè se ad esempio io clicco sul valore val3 dovrei aprire la pagina corrispondente il record.


Sql = "SELECT *, min(prezzo1) AS minprezzo1, min(prezzo2) AS minprezzo2, min(prezzo3) AS minprezzo3 FROM prodotti WHERE disponibile>0 GROUP BY codart HAVING min(prezzo1)=minprezzo1 and min(prezzo2)=minprezzo2 and min(prezzo3)=minprezzo3 ORDER BY marca ASC"

Carmen
11.886 messaggi dal 09 febbraio 2002
Contributi
Carmen ha scritto:

io avevo provato così e mi funziona. L'unico problema che non mi torna l'id (contatore) corrispondente ai valori estratti


allora prova così, effettuando delle join della tabella prodotti con sé stessa, ma fai attenzione alle sue prestazioni. Ha una subquery e svariate join, se hai molte migliaia di prodotti potrebbe diventare molto lenta. Assicurati di avere degli indici sulle colonne codart, prezzo1, prezzo2 e prezzo3.
SELECT minimi.*, p1.id as id1, p2.id as id2, p3.id as id3 FROM (SELECT codart, min(prezzo1) AS minprezzo1, min(prezzo2) AS minprezzo2, min(prezzo3) AS minprezzo3 FROM prodotti WHERE disponibile>0 GROUP BY codart) as minimi LEFT JOIN prodotti as p1 ON (minimi.minprezzo1=p1.prezzo1 AND minimi.codart=p1.codart) LEFT JOIN prodotti as p2 ON (minimi.minprezzo2=p2.prezzo2 AND minimi.codart=p2.codart) LEFT JOIN prodotti as p3 ON (minimi.minprezzo3=p3.prezzo3 AND minimi.codart=p3.codart) GROUP BY minimi.codart


E comunque mi sono accorto che le query che ti avevo consigliato ieri non funzionano. Infatti l'ID restituito non era necessariamente quello del record che porta il valore minimo, ma quello del primo record di ogni gruppo. Resto dell'opinione che sia meglio dividere il problema in 3 parti e poi ricomporre i risultati. Sul sito di MySql ho trovato questo articolo:
http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html
Nel commento di Kasey Speakman trovi una soluzione da provare come alternativa alla prima query, se dovesse risultare troppo lenta.
SELECT * FROM (SELECT Id, codart, prezzo1 as prezzo FROM prodotti WHERE disponibile>0 ORDER BY prezzo1) AS p GROUP BY codart;

Questa restituisce i minimi per prezzo1 ma puoi ripeterla per prezzo2 e prezzo3 e poi unire i risultati di ciascuna.

ciao,
Modificato da BrightSoul il 18 ottobre 2011 21.03 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.