2011-09-28 70 views
8

看似简单的MySQL问题,但我从来没有这样做过..MySQL左加入+最小

我有两个表,物品和价格,与一对多的关系。

Items Table 
id, name 

Prices Table 
id, item_id, price 

prices.item_id = items.id 

我到目前为止有:

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

我怎么也返回相应prices.id为最低价格是多少?谢谢!

+1

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

回答

15

这将返回多个记录中的项目记录,如果有多个价格记录它的最低价格:

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

辉煌,谢谢。我越来越接近这个...知道我需要一个子查询的地方。 – Charles

+0

这是我正在努力取代我的答案,但帕特里克击败了我。 – Sonny

+2

这是如何实现一个类似的查询效率,并杀死我的加载时间,即使有各种指标等 – Horse

0

好的,怎么样?

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

当我这样做时,它返回第一个pri ces.id找到它,而不是与最小值对应的那个。 – Charles

+2

似乎没有工作 – Charles

9

新,工作答案的基础上,最后一个例子中的MySQL 5.0参考手册 - 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 

LEFT JOIN工作的基础上,当prices.price是在其最小值,有否filter.price具有较小的值,并且filter行值将为NULL。


原件不正确的答案:

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

我试图在项目表中显示所有结果。此处的LIMIT 1应用于主Items查询,并仅返回一个结果。 – 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