2011-09-28 14 views
8

pregunta aparentemente simple de MySQL, pero nunca he tenido que hacer esto antes ..MySQL combinación izquierda + Mín

Tengo dos tablas, artículos y precios, con una relación de uno a muchos.

Items Table 
id, name 

Prices Table 
id, item_id, price 

Dónde

prices.item_id = items.id 

Lo que tengo hasta ahora:

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

¿Cómo también devolver el prices.id correspondiente para que el precio mínimo? ¡Gracias!

+1

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

Respuesta

15

Esto devolverá múltiples registros para un registro de artículos si hay varios precios registros para ello con el precio mínimo:

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, gracias. Estaba cada vez más cerca de pensar en esto ... sabía que necesitaría una subconsulta en alguna parte. – Charles

+0

Esta es la consulta en la que estaba trabajando para reemplazar mi respuesta, pero Patrick me ganó. – Sonny

+2

¿Cómo es esto de eficiencia? Implementé una consulta similar y mató mi tiempo de carga, incluso con varios índices, etc. – Horse

0

Ok, ¿qué tal?

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

Cuando lo hago, devuelve el primer pri ces.id que encuentra, no el que corresponde al Mínimo. – Charles

+2

parece que no funciona – Charles

9

nuevo, la respuesta de trabajo, basado en el último ejemplo en el Manual 5.0 de referencia de MySQL - 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 

Los LEFT JOIN trabajos sobre la base de que cuando prices.price está en su valor mínimo, no es no filter.price con un valor menor y los valores de las filas filter serán NULL.


original respuesta incorrecta:

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

Estoy intentando mostrar todos los resultados en la tabla Elementos. El LÍMITE 1 aquí se aplica a la consulta principal de elementos y solo devuelve un resultado. – 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 
Cuestiones relacionadas