2017-10-05 70 views
0

我花了許多小時尋找解決我目前的問題,但沒有運氣。複雜更新,然後插入SQL

我有4個表:

- 追求

ACC_ID key  value 
10000 LOGIN  1 
10000 LOGINCNT 3 
10000 LOGINTMR 8465 
10002 LOGIN  0 
10002 LOGINCNT 2 
10002 LOGINTMR 82415 
10003 LOGIN  1 
10003 LOGINCNT 1 
10003 LOGINTMR 3650 

- 字符

*C_ID ACC_ID Online 
100 10000 1 
101 10000 0 
102 10001 0 
103 10000 0 
104 10002 1 
105 10003 1 
106 10002 0 
107 10000 0 
108 10003 0 

- 郵件

*M_ID C_ID Title Message 
1  100 Event Free Gift 
2  100 Event Free Gift 
3  104 Event Free Gift 
4  105 Event Free Gift 

- mail_item

*ID M_ID Item_ID Amnt 
1 1  3521  1 
2 1  3522  1 
3 3  3521  1 
4 3  3522  1 
5 2  1638  8 
6 4  3521  1 
7 4  3522  1 

注:帶*列是唯一到該表

我想要做的是UPDATE上取決於這些標準追求表中的每個。 。:

  • if 關鍵是LOGIN和ACC_ID是字符然後 = 1,否則,如果不在線則 = 0
  • 如果關鍵是LOGINTMR和ACC_ID在線上字符然後在線 =(UNIX紀元時間),否則,如果不在線則 = 0
  • 如果有史以來第一個標準的是1,那麼插入新行中郵箱mail_item得到C_ID字符這是在線。

注意到有上字符許多行與ACC_ID 10000,但只有1行網上。其他ACC_ID可能根本沒有在線字符。因此,如果對個字符進行查詢,則應該返回在線 = 1或如果在線 = 0的最後結果。

由於這種複雜性,它讓我頭暈目眩。我希望有人能幫忙。

+0

'mail_item'中的列從哪裏來? – Barmar

+0

爲什麼100在郵件表中有兩個條目? – Valli

+0

@Barmar - mail_item來自郵件上附加的項目.. –

回答

1

這裏的UPDATE查詢:

UPDATE quest AS q 
LEFT JOIN (
    SELECT acc_id, MAX(online) AS online 
    FROM characters 
    GROUP BY acc_id) AS c 
ON q.acc_id = c.acc_id 
SET q.value = 
    CASE q.key 
     WHEN 'LOGIN' THEN IFNULL(c.online, 0) 
     WHEN 'LOGINMTR' THEN IF(IFNULL(c.online, 0), UNIX_TIMESTAMP(), 0) 
     ELSE q.value 
    END 

而且INSERT

INSERT INTO mail (c_id, title, message) 
SELECT c.c_id, 'Event', 'Free Gift' 
FROM characters AS c 
JOIN quest AS q ON c.acc_id = q.acc_id 
WHERE q.key = 'LOGIN' 
AND c.online = 1 

我不明白什麼應該被插入mail_item

+0

是否有可能使其成爲1查詢?因此如果某個帳戶處於聯機狀態,它將插入郵件。 –

+0

不,不可能執行更新並插入單個查詢。 – Barmar

+0

使用事務來確保它們之間的一致性。 – Barmar