2011-02-04 32 views
5

Ho una tabella chiamata "Inventario" con i campi di Prodotto (varchar), Importo (int), Tipo (varchar)Ritorno di lunghezza minima nel database MySQL

Quello che vorrei estrarre è righe con il seguenti campi:

Shortest voce nel campo Oggetto di tutti gli elementi di tipo tipo

Somma di tutti gli importi di tutte le voci di tipo tipo

ho il seguente:

che fornisce ciò che voglio tranne che non restituisce l'elemento più breve, invece ha uno degli altri elementi (l'ultimo che trova penso). Per breve intendo la lunghezza minima della corda.

Grazie per qualsiasi aiuto.

+0

In MySQL, il comportamento di selezionare una colonna che non è nell'elenco GROUP BY non è definito. MySQL può restituire qualsiasi valore della riga corrispondente per quella colonna. –

+0

Una domanda più specifica con i dati di test e l'output previsto sarebbe di grande aiuto. –

risposta

7

si può ottenere dai sub query.

select type, sum(amount), item 
from inventory 
group by type 
having length(item) <= (select min(length(item)) from inventory) 

utente Order By columnName ASC /DESC per l'ordinamento e LIMIT 1 per ottenere uno su che

+0

Con l'avvertenza che se più elementi hanno la stessa lunghezza minore, non è definito quale di questi articoli della stessa lunghezza verrà restituito. –

1

select type, sum(amount), min(length(item)) from inventory group by type

dovrebbe fare quello che vuoi

+0

No, ci avevo già pensato. Quella query restituisce la lunghezza della stringa di lunghezza minima dell'articolo invece della stringa oggetto stessa. – Goofy

+0

Ah scusa. Dare uno sparo 'seleziona e.type, max_b.s, e.item dall'inventario e inner join (seleziona e2.type, sum (e2.amount) as s, e2.item, min (length (e2.item)) come bb dall'inventario gruppo e2 di e2.type) max_b on (lunghezza (e.item) = max_b.bb) gruppo da e.type; ' –

+0

La mia risposta è nel commento sopra. È il posto giusto per questo o dovrei creare una nuova risposta e metterla lì? –

0

Non sai da dove dovrebbe andare, in modo da sto creando una nuova risposta:

select e.type, min_item.s, e.item from inventory e inner join (select e2.type, sum(e2.amount) as s, e2.item, min(length(e2.item)) as bb from inventory e2 group by e2.type) min_item on (length(e.item)=min_item.bb) group by e.type; 

Ho provato questo e ha funzionato.

Problemi correlati