2012-02-22 36 views
6

Tôi có hai bảng: -MySQL UPDATE, MAX, JOIN truy vấn

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

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

Tôi muốn để lưu trữ các product_id ghi bàn hàng đầu cho mỗi nhà sản xuất trong một bảng tóm tắt: -

summary_table 
manufacturer, max_score 
ford, 1 
toyota, 3 

Vì vậy, đến nay tôi đã có: -

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; 

Có khó khăn ... Tất cả trợ giúp đều được đánh giá rất cao.

+0

Bạn gặp sự cố gì? – dansasu11

+0

bạn có gặp lỗi không? đầu ra từ truy vấn hiện tại của bạn là gì? – northpole

Trả lời

2

Như tôi đã hiểu được vấn đề tôi nghĩ rằng điều này sẽ làm việc, tôi đã sử dụng MAX(Product_ID) chỉ để giải quyết bất kỳ bản sao nào, trong đó 2 sản phẩm cho cùng một sản phẩm có thể có cùng điểm số và cả hai đều là điểm số cao nhất. Bạn có thể muốn phân giải các bản sao khác nhau.

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

Tác vụ này sẽ mất 29 ngày để xử lý 11 triệu hàng trong product_table. Bất kỳ suy nghĩ về một phương pháp nhanh hơn? –

+0

Được đánh chỉ mục đúng chưa? Ngay cả trên 11 triệu hàng này cũng sẽ chạy khá nhanh. Tôi muốn câu hỏi sự cần thiết cho một bảng tóm tắt, một xem tóm tắt sẽ tốt hơn, sẽ không yêu cầu cập nhật thường xuyên, và nên duy trì chỉ mục. Thật không may tôi đã làm rất ít công việc với MySQL và chỉ thực sự làm việc với SQL Server vì vậy lời khuyên của tôi có lẽ không phải là thích hợp nhất. Lấy làm tiếc. – GarethD

+0

Có một chỉ mục bị mất (product_table.Score), nó sẽ vẫn mất vài giờ, khi bạn nói khá nhanh là điều này bạn muốn nói gì? –

2

Hãy thử truy vấn này -

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 

truy vấn này đặt product_id cho điểm tối đa:

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

Đây không phải là những gì mà OP yêu cầu. Điều này trả về điểm tối đa cho mỗi nhà sản xuất, không phải là ID sản phẩm tính điểm tối đa cho mỗi nhà sản xuất. – GarethD

+0

Có, bạn đã đúng. Lúc đầu, tôi hiểu rằng max_score phải như - MAX (điểm). Tôi đã thêm truy vấn mới. Cảm ơn. – Devart

Các vấn đề liên quan