2011-09-28 9 views
8

domanda apparentemente semplice MySQL, ma non ho mai avuto a che fare questo prima ..MySQL sinistra + Min

Ho due tabelle, oggetti e prezzi, con una relazione uno-a-molti.

Items Table 
id, name 

Prices Table 
id, item_id, price 

Dove

prices.item_id = items.id 

Quello che ho finora:

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

Come posso anche restituire il prices.id corrispondente per quel prezzo minimo? Grazie!

+1

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

risposta

15

Ciò restituirà più record per un record in prodotti che, se ci sono più i prezzi record per questo con il prezzo minimo:

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

Brillante, grazie. Mi stavo avvicinando a questo ... sapevo che avrei bisogno di una subquery da qualche parte. – Charles

+0

Questa è la domanda a cui stavo lavorando per sostituire la mia risposta, ma Patrick mi ha battuto su di esso. – Sonny

+2

Come è questo per l'efficienza come attuata una query simile e la sua ucciso il mio tempo di caricamento, anche con vari indici, ecc – Horse

0

Ok, che ne dite?

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

Quando lo faccio, restituisce il primo pri ces.id che trova, non quello che corrisponde a quello Minimo. – Charles

+2

non sembra funzionare – Charles

9

Nuovo, risposta di lavoro, basata sull'esempio finale nel MySQL Manuale 5.0 Riferimento - 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 

Le LEFT JOIN lavori sulla base del fatto che, quando prices.price è al suo valore minimo, non v'è no filter.price con un valore inferiore e i valori delle righe filter saranno NULL.


originale risposta sbagliata:

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

Sto provando a visualizzare tutti i risultati nella tabella degli articoli. Il LIMIT 1 qui è applicato alla query degli Elementi principali e restituisce solo un risultato. – 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