20

一見単純な MySQL の質問ですが、これまでにこれを行う必要はありませんでした..

1 対多の関係を持つ 2 つのテーブル、アイテムと価格があります。

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

その最低価格に対応する price.id も返すにはどうすればよいですか? ありがとう!

4

4 に答える 4

33

最小価格の複数の Price レコードがある場合、これは 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
    )
);
于 2011-09-28T19:22:33.030 に答える
15

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

が最小値の場合、それより小さい値は存在せず、行の値は NULL になることLEFT JOINに基づいて機能します。prices.pricefilter.pricefilter


元の不正解:

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
于 2011-09-28T19:07:22.140 に答える
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 
于 2011-09-28T19:11:41.933 に答える
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)  
于 2011-09-28T19:02:44.673 に答える