2011-02-04 33 views
5

Tôi có một bảng gọi là "hàng tồn kho" với các lĩnh vực mục (varchar), Thành tiền (int), Type (varchar)Return of độ dài tối thiểu trong cơ sở dữ liệu MySQL

Những gì tôi muốn trích xuất là hàng với các lĩnh vực sau:

entry ngắn nhất trong lĩnh vực hàng của tất cả các mục của loại loại

Sum của tất cả các khoản tiền của tất cả các mục của loại loại

tôi đã điều sau đây:

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

cung cấp những gì tôi muốn trừ khi nó không trả lại Mục ngắn nhất, thay vào đó nó có một trong các Mục khác (mục cuối cùng tôi tìm thấy). Bởi ngắn nhất tôi có nghĩa là chiều dài chuỗi tối thiểu.

Cảm ơn bạn đã được trợ giúp.

+0

Trong MySQL, hành vi chọn cột không nằm trong danh sách GROUP BY của bạn chưa được xác định. MySQL có thể trả về bất kỳ giá trị của hàng phù hợp nào cho cột đó. –

+0

Câu hỏi cụ thể hơn với dữ liệu thử nghiệm và đầu ra dự kiến ​​sẽ giúp ích rất nhiều. –

Trả lời

7

Bạn có thể lấy nó bằng cách phụ truy vấn.

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

tài Order By columnName ASC /DESC để phân loại và LIMIT 1 để nhận một trong số đó

+0

Với báo trước rằng nếu nhiều mục có cùng độ dài ngắn nhất, không xác định được những mục nào có cùng độ dài sẽ được trả về. –

1

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

nên làm những gì bạn muốn

+0

Không, tôi đã nghĩ về điều đó. Truy vấn đó trả về độ dài của chuỗi Item length length thay vì chính chuỗi Item. – Goofy

+0

Ah xin lỗi. Cung cấp cho một shot này 'chọn e.type, max_b.s, e.item từ hàng tồn kho e bên trong tham gia (chọn e2.type, tổng (e2.amount) là s, e2.item, min (length (e2.item)) như bb từ nhóm hàng tồn kho e2 bởi e2.type) max_b trên (chiều dài (e.item) = max_b.bb) nhóm theo e.type; ' –

+0

Câu trả lời của tôi là ở phần bình luận ở trên. Đó có phải là nơi thích hợp cho nó hay tôi nên tạo một câu trả lời mới và đặt nó ở đó? –

0

Không chắc chắn nơi này nên đi, vì vậy tôi tạo ra một câu trả lời mới:

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; 

Tôi thử nghiệm này va no đa hoạt động.

Các vấn đề liên quan