2011-02-04 14 views
5

Tengo una tabla llamada "Inventario" con los campos de artículos (varchar), Cantidad (int), Tipo (varchar)Retorno de longitud mínima en la base de datos MySQL

Lo que me gustaría extraer es filas con el siguientes campos:

entrada más corta en el campo de artículos de todos los elementos de tipo tipo

suma de todas las cantidades de todos los artículos de tipo tipo

Tengo el siguiente:

SELECT Item, sum(Amount) FROM Inventory GROUP BY Type 

que da lo que quiero, excepto que no devuelve el artículo más corto, en su lugar tiene uno de los otros artículos (el último que encuentro, creo). Por más corto me refiero a la longitud mínima de la cuerda.

Gracias por cualquier ayuda.

+0

En MySQL, el comportamiento de seleccionar una columna que no está en su lista GROUP BY no está definido. MySQL puede devolver el valor de cualquier fila coincidente para esa columna. –

+0

Una pregunta más específica con datos de prueba y resultados esperados sería de gran ayuda. –

Respuesta

7

lo puede conseguir por sub consulta.

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

usuario Order By columnName ASC /DESC para clasificar y LIMIT 1 para conseguir uno de esa

+0

Con la advertencia de que si varios elementos tienen la misma longitud más corta, no se define qué elementos de la misma longitud serán devueltos. –

1

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

debe hacer lo que quiera

+0

No, ya pensé en eso. Esa consulta devuelve la longitud de la cadena de Artículo de longitud mínima en lugar de la cadena de Artículo misma. – Goofy

+0

Ah, lo siento. Dale una oportunidad: selecciona e.type, max_b.s, e.item del inventario e inner join (selecciona e2.type, sum (e2.amount) como s, e2.item, min (length (e2.item)) como bb del inventario e2 group por e2.type) max_b on (length (e.item) = max_b.bb) group por e.type; ' –

+0

Mi respuesta está en el comentario anterior. ¿Es ese el lugar adecuado o debería crear una nueva Respuesta y ponerla allí? –

0

No estoy seguro de que esto debe ir, por lo que estoy creando una nueva respuesta:

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; 

Probé esto Y funcionó.

Cuestiones relacionadas