2012-04-10 34 views
10

Tôi sẽ đi trước và gửi mã MySQL đáng sợ của tôi:MySQL cập nhật nếu giá trị lớn hơn giá trị hiện tại

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(302 > uptime, 302, uptime), if(0 > players, 0, players), if(1 > rank, 1, rank) 

Ok, vì vậy hãy để tôi giải thích những gì tôi đang cố gắng làm.

  1. "id" có chỉ mục duy nhất. Nếu chỉ mục đó không tồn tại, tôi muốn chèn các giá trị đó.
  2. Nếu có khóa trùng lặp, thay vào đó, tôi muốn CẬP NHẬT mỗi trường trong 3 trường, chỉ NẾU các giá trị mới lớn hơn giá trị hiện tại trong bảng.

Có vẻ như tôi đang làm điều gì đó khủng khiếp sai, và tôi khá thẳng thắn KHÔNG biết phải làm gì. Tôi đã cố gắng làm cho nó tốt, nhưng hóa ra lại là một mớ hỗn độn kinh khủng.

Tôi hy vọng rằng ai đó có thể dẫn dắt tôi đi đúng hướng, và giúp tôi học (và bất kỳ ai khác đang cố gắng học hỏi) cách làm những việc như thế này. Cảm ơn bạn.

+1

Vì vậy, bạn đã là tốt cho 'uptime', lặp lại nó cho' players' và 'rank' và nó sẽ hoạt động – zerkms

+0

Rất tiếc. một Lat. Tôi thấy những gì bạn đang nói về, nhưng tôi không nghĩ đó là vấn đề thực tế. Edit: oh my gosh, đó là vấn đề! Hãy tiếp tục và trả lời. – fruitcup

+0

và vấn đề thực tế là gì? Tôi không thấy bất kỳ câu hỏi nào trong câu hỏi – zerkms

Trả lời

27

truy vấn của bạn có vẻ tốt nhưng bạn có thể cải thiện nó cho rõ ràng:

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
    VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE 
    uptime = GREATEST(uptime, VALUES(uptime)), 
    players = GREATEST(players, VALUES(players)), 
    rank = GREATEST(rank, VALUES(rank)) 
+2

'GREATEST' và' LEAST' - đó là những gì tôi luôn luôn quên ;-) +1 – zerkms

+0

o.O Đó là ... tuyệt vời. – fruitcup

+0

TUYỆT VỜI ... khá tiện dụng – GoldenJoe

4

Bạn có thể tránh một chút trùng lặp bằng cách sử dụng chức năng VALUES. Và những thứ khác chỉ là tốt trong truy vấn của bạn

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(VALUES(uptime) > uptime, VALUES(uptime), uptime) 
+0

Tôi không biết làm thế nào tôi bỏ qua một cái gì đó như thế. Thật là một lỗi đánh máy>.> Dù sao, cảm ơn bạn đã phát hiện ra điều đó! Tôi có lẽ sẽ không bao giờ tìm ra nó. Và nó làm cho tôi cảm thấy tốt rằng tôi gần như đã làm đúng. :) – fruitcup

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