MySQL Left Join + Мин - PullRequest
       13

MySQL Left Join + Мин

13 голосов
/ 28 сентября 2011

Казалось бы, простой вопрос 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

Как я также могу вернуть соответствующий цен.ид для этой минимальной цены? Спасибо!

Ответы [ 4 ]

24 голосов
/ 28 сентября 2011

Будет возвращено несколько записей для записи в Товарах, если для него будет несколько записей цен с минимальной ценой:

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
    )
);
11 голосов
/ 28 сентября 2011

Новый рабочий ответ, основанный на последнем примере Справочного руководства по 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

* 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
0 голосов
/ 28 сентября 2011
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 голосов
/ 28 сентября 2011

Хорошо, а как же?

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)  
...