webdevqa.jp.net

MySQL左結合+最小

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

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

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も返すにはどうすればよいですか?ありがとう!

16
Charles

これにより、最小価格のレコードに複数の価格レコードがある場合、アイテムのレコードに複数のレコードが返されます。

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
    )
);
28

MySQL 5.0リファレンスマニュアルの最後の例に基づく、新しい実用的な回答 .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

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
13
Sonny

わかりました、どうですか?

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
JMK
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 
0
Eric R.