2011-09-28 49 views
8

Câu hỏi MySQL đơn giản dường như, nhưng tôi chưa bao giờ phải làm điều này trước đây.MySQL Left Join + Min

Tôi có hai bảng, mục và giá, với mối quan hệ một-nhiều.

Items Table 
id, name 

Prices Table 
id, item_id, price 

đâu

prices.item_id = items.id 

Những gì tôi có cho đến nay:

SELECT items.id, items.name, MIN(prices.price) 
FROM items 
LEFT JOIN prices ON items.id = prices.item_id 
GROUP BY items.id 

Làm thế nào tôi cũng trả lại prices.id tương ứng cho rằng mức giá tối thiểu? Cảm ơn!

+1

http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html – Karolis

Trả lời

15

này sẽ trở lại nhiều hồ sơ cho một kỷ lục trong mục nếu có nhiều giá hồ sơ cho nó với giá tối thiểu:

select items.id, items.name, prices.price, prices.id 
from items 
left join prices on (
    items.id = prices.item_id 
    and prices.price = (
     select min(price) 
     from prices 
     where item_id = items.id 
    ) 
); 
+0

Tuyệt vời, cảm ơn bạn. Tôi đã tiến gần hơn đến việc này ... biết rằng tôi sẽ cần một câu hỏi con ở đâu đó. – Charles

+0

Đây là truy vấn tôi đang làm để thay thế câu trả lời của tôi, nhưng Patrick đánh tôi với câu trả lời đó. – Sonny

+2

Làm thế nào để hiệu quả khi thực hiện truy vấn tương tự và nó đã giết thời gian tải của tôi, ngay cả với các chỉ mục khác nhau, vv – Horse

0

Ok, còn thế nào?

SELECT items.id, items.name, MIN(prices.price), prices.id 
FROM items 
LEFT JOIN prices ON items.id = prices.item_id 
GROUP BY items.id, MIN(prices.price) 
+0

Khi tôi làm điều đó, nó trả về pri đầu tiên ces.id mà nó tìm thấy, không phải là cái tương ứng với cái tối thiểu. – Charles

+2

dường như không hoạt động hoặc – Charles

9

mới, câu trả lời làm việc, dựa trên ví dụ cuối cùng trong MySQL Manual 5.0 Reference - 3.6.4. The Rows Holding the Group-wise Maximum of a Certain Column:

SELECT items.id, items.name, prices.price, prices.id 
FROM items 
LEFT JOIN prices 
    ON prices.item_id = items.id 
LEFT JOIN prices AS filter 
    ON filter.item_id = prices.item_id 
    AND filter.price < prices.price 
WHERE filter.id IS NULL 

Các LEFT JOIN công trình trên cơ sở rằng khi prices.price là giá trị nhỏ nhất của nó, có không có filter.price có giá trị nhỏ hơn và giá trị hàng filter sẽ là NULL.


câu trả lời không chính xác gốc:

SELECT items.id, items.name, prices.price, prices.id 
FROM items 
LEFT JOIN prices ON prices.item_id = items.id 
ORDER BY prices.price ASC 
LIMIT 1 
+1

Tôi đang cố gắng hiển thị tất cả kết quả trong bảng Mục. LIMIT 1 ở ​​đây được áp dụng cho truy vấn Items chính và chỉ trả về một kết quả. – Charles

0
SELECT top 1 items.id, items.name, prices.price, prices.id 
FROM items 
LEFT JOIN prices ON items.id = prices.item_id 
ORDER BY prices.price ASC