然后在SQL

时间:2017-10-05 04:09:50

标签: mysql

我花了很多时间寻找解决当前问题的方法,但没有运气。

我有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每个我想要做的是......:

  • 如果是LOGIN并且ACC_ID在字符上联机,那么 = 1否则如果不在线那么 = 0。
  • 如果 key 是LOGINTMR且ACC_ID在字符上联机,那么 =(UNIX纪元时间)否则如果不在线那么 = 0。
  • 如果第一个条件为1,则在邮件中插入新行, mail_item 获取 C_ID 来自字符,这是在线。

请注意字符上有很多行, ACC_ID 10000但只有1行在线。其他 ACC_ID 可能根本没有在线角色。因此,如果对字符进行查询,则应返回 online = 1的行或 online = 0时的最后结果。

由于这种情况的复杂性,它让我头晕目眩。我希望有人可以提供帮助。

1 个答案:

答案 0 :(得分: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插入什么内容。