MySQL Left Join + Min

Cha*_*les 13 mysql group-by min left-join greatest-n-per-group

看似简单的MySQL问题,但我以前从来没有这样做过..

我有两张桌子,物品和价格,有一对多的关系.

Items Table
id, name

Prices Table
id, item_id, price
Run Code Online (Sandbox Code Playgroud)

哪里

prices.item_id = items.id
Run Code Online (Sandbox Code Playgroud)

到目前为止我所拥有的:

SELECT items.id, items.name, MIN(prices.price)
FROM items
LEFT JOIN prices ON items.id = prices.item_id
GROUP BY items.id
Run Code Online (Sandbox Code Playgroud)

如何以最低价格返回相应的price.id?谢谢!

小智 25

如果有最多价格的多个价格记录,这将为Items中的记录返回多个记录:

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
    )
);
Run Code Online (Sandbox Code Playgroud)

  • 这对于效率如何实现类似的查询,并且它消耗了我的加载时间,即使有各种索引等 (2认同)
  • 似乎工作,但我有同样的问题,如@Horse加载时间是不可接受的,在我的情况下不是生产准备. (2认同)

Son*_*nny 12

基于MySQL 5.0参考手册 - 3.6.4中的最后一个例子,新的,有效的答案.行保持某一列的组最大值:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)