2012-02-22 18 views
6

Tengo dos tablas: -MySQL UPDATE, MAX, consulta de combinación

manu_table 
product_id, manufacturer 
1, ford 
2, ford 
3, toyota 

product_table 
product_id, score 
1, 80 
2, 60 
3, 40 

me gustaría para almacenar el product_id mayor puntuación para cada fabricante en una tabla resumen: -

summary_table 
manufacturer, max_score 
ford, 1 
toyota, 3 

Así Hasta ahora tengo: -

UPDATE summary_table st 
SET max_score = (
       SELECT product_id 
       FROM (
         SELECT manufacturer, product_id, max(score) as ms 
         FROM manu_table 
         LEFT JOIN product_table USING (product_id) 
         group by product_id) t) 
WHERE st.manufacturer = manu_table.manufacturer; 

Problemas ... Toda la ayuda se aprecia mucho.

+0

¿Qué problemas tienes? – dansasu11

+0

¿recibe un error? ¿Cuál es el resultado de su consulta actual? – northpole

Respuesta

2

Según entiendo el problema creo que esto funcionaría, he utilizado MAX(Product_ID) sólo para resuelva cualquier duplicado, donde 2 productos para la misma fabricación podrían tener el mismo puntaje y ambos serían el puntaje más alto. Es posible que desee resolver duplicados de manera diferente.

UPDATE summary_table 
SET  max_score = 
     ( SELECT MAX(m.Product_ID) [MaxScoreProductID] 
      FROM manu_table m 
        INNER JOIN product_table p 
         ON m.Product_ID = p.Product_ID 
        INNER JOIN 
        ( SELECT Manufacturer, MAX(Score) [MaxScore] 
         FROM manu_table m 
           LEFT JOIN product_table p 
            ON m.Product_ID = p.Product_ID 
         GROUP BY Manufacturer 
        ) ms 
         ON ms.Manufacturer = m.Manufacturer 
         AND ms.MaxScore = p.Score 
      WHERE m.Manufacturer = summary_table.Manufacturer 
      GROUP BY m.Manufacturer 
     ) 
+0

Esto funciona, pero llevará 29 días procesar 11 millones de filas en product_table. ¿Alguna idea sobre un método más rápido? –

+0

¿Está indexado correctamente? Incluso en 11 millones de filas esto debería ejecutarse con bastante rapidez. Me gustaría cuestionar la necesidad de una tabla de resumen, una vista de resumen sería mejor, no requeriría actualizaciones regulares y debería mantener los índices. Desafortunadamente, he trabajado muy poco con MySQL y realmente solo trabajo con SQL Server, por lo que mi consejo probablemente no sea el más apropiado. Lo siento. – GarethD

+0

Sí, falta un índice (product_table.Score), todavía tomará algunas horas, cuando dices bastante rápido, ¿es esto lo que quieres decir? –

2

Intentar esta consulta -

UPDATE summary_table st 
    JOIN (
    SELECT mt.manufacturer, MAX(pt.score) max_score FROM manu_table mt 
    JOIN product_table pt 
     ON mt.product_id = pt.product_id 
    GROUP BY mt.manufacturer) t 
    ON t.manufacturer = st.manufacturer 
SET st.max_score = t.max_score 

Esta consulta establece product_id para la puntuación máxima:

UPDATE summary_table st 
    JOIN (SELECT t1.* FROM 
    (SELECT mt.*, pt.score FROM manu_table mt JOIN product_table pt ON mt.product_id = pt.product_id) t1 
    JOIN (
    SELECT mt.manufacturer, MAX(pt.score) max_score FROM manu_table mt 
    JOIN product_table pt 
     ON mt.product_id = pt.product_id 
    GROUP BY mt.manufacturer 
) t2 
    ON t1.manufacturer = t2.manufacturer AND t1.score = t2.max_score 
) t 
    ON t.manufacturer = st.manufacturer 
SET st.max_score = t.product_id 
+0

Esto no es lo que solicitó OP. Esto devuelve el puntaje Máx. Para cada fabricante, no el ID máximo del producto para cada fabricante. – GarethD

+0

Sí, tienes razón. Al principio entendí que max_score debería ser como es - MAX (puntaje). He agregado una nueva consulta. Gracias. – Devart

Cuestiones relacionadas