2010-06-11 41 views
40

Tôi đang cố tạo truy vấn cập nhật và thực hiện ít tiến bộ trong việc nhận cú pháp đúng. Truy vấn sau đang hoạt động:Truy vấn cập nhật MySQL với tham gia trái và nhóm theo

SELECT t.Index1, t.Index2, COUNT(m.EventType) 
    FROM Table t 
    LEFT JOIN MEvents m ON 
     (m.Index1 = t.Index1 AND 
     m.Index2 = t.Index2 AND 
     (m.EventType = 'A' OR m.EventType = 'B') 
    ) 
    WHERE (t.SpecialEventCount IS NULL) 
    GROUP BY t.Index1, t.Index2 

Nó tạo danh sách ba nhóm Index1, Index2, EventCounts. Nó chỉ thực hiện điều này trong trường hợp t.SpecialEventCount là NULL. Truy vấn cập nhật mà tôi đang cố gắng viết nên đặt SpecialEventCount này thành số đó, tức là COUNT (m.EventType) trong truy vấn ở trên. Con số này có thể là 0 hoặc bất kỳ số dương nào (do đó là phần nối trái). Chỉ số 1 và chỉ số 2 cùng nhau là duy nhất trong Bảng t và chúng được sử dụng để xác định các sự kiện trong MEvent.

Làm cách nào để sửa đổi truy vấn chọn để trở thành truy vấn cập nhật? I E. một cái gì đó như

UPDATE Table SET SpecialEventCount=COUNT(m.EventType)..... 

nhưng tôi nhầm lẫn những gì để đặt ở đâu và đã thất bại với nhiều dự đoán khác nhau.

Trả lời

68

Tôi lấy nó là (Index1, Index2) là khóa duy nhất trên Table, nếu không tôi sẽ mong đợi tham chiếu đến t.SpecialEventCount dẫn đến lỗi.

truy vấn biên soạn để sử dụng subquery vì nó đã không làm việc sử dụng GROUP BY

UPDATE 
    Table AS t 
    LEFT JOIN (
     SELECT 
      Index1, 
      Index2, 
      COUNT(EventType) AS NumEvents 
     FROM 
      MEvents 
     WHERE 
      EventType = 'A' OR EventType = 'B' 
     GROUP BY 
      Index1, 
      Index2 
    ) AS m ON 
     m.Index1 = t.Index1 AND 
     m.Index2 = t.Index2 
SET 
    t.SpecialEventCount = m.NumEvents 
WHERE 
    t.SpecialEventCount IS NULL 
+1

Cảm ơn, trông giống như nhiều thứ tôi đã thử. Thật không may trở lại với lỗi sau: # 1064 - Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để có cú pháp đúng để sử dụng gần 'GROUP BY t.Index1, t.Index2' tại dòng 9 – Rob

+0

bằng phiên bản 5.0.90-log nếu điều này giúp – Rob

+1

được chỉnh sửa để sử dụng truy vấn phụ – Hammerite

4

Làm một trái tham gia với một subquery sẽ tạo ra một người khổng lồ bảng tạm thời trong bộ nhớ rằng sẽ không có chỉ mục.

Để cập nhật, cố gắng tránh tham gia và sử dụng tương quan subqueries thay vì:

UPDATE 
    Table AS t 
SET 
    t.SpecialEventCount = (
     SELECT COUNT(m.EventType) 
     FROM MEvents m 
     WHERE m.EventType in ('A','B') 
      AND m.Index1 = t.Index1 
      AND m.Index2 = t.Index2 
    ) 
WHERE 
    t.SpecialEventCount IS NULL 

Do một số hồ sơ, nhưng điều này có thể nhanh hơn đáng kể trong một số trường hợp.

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