2015-07-03 27 views
-1

我上的程序排队的4名球员MySQL的更新多个行和列的条件

任何视频游戏玩家的工作,这是我的表结构:

CREATE TABLE IF NOT EXISTS `ozbah_users` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_name` varchar(255) NOT NULL, 
    `user_status` varchar(2) NOT NULL, 
    `user_priority` varchar(2) NOT NULL, 
    `user_event_id` int(11) NOT NULL, 
    `user_modifiedon` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`user_id`), 
    KEY `user_event_id` (`user_event_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ; 


+-----------------+--------------+------+-----+-------------------+------------- 
---+ 
| Field   | Type   | Null | Key | Default   | Extra 
    | 
+-----------------+--------------+------+-----+-------------------+------------- 
---+ 
| user_id   | int(11)  | NO | PRI | NULL    | auto_increme 
nt | 
| user_name  | varchar(255) | NO |  | NULL    | 
    | 
| user_priority | varchar(2)  | NO |  | NULL    | 
    | 
| user_status  | varchar(2) | NO |  | NULL    | 
    | 
| user_event_id | int(11)  | NO | MUL | NULL    | 
    | 
| user_modifiedon | timestamp | NO |  | CURRENT_TIMESTAMP | 
    | 
+-----------------+--------------+------+-----+-------------------+------------- 

,这是插入的数据:

INSERT INTO `ozbah_users` (`user_id`, `user_name`, `user_priority`, `user_status`, `user_event_id`, `user_modifiedon`) VALUES 
(1, 'A', 'A1', 'A', 1, '2015-06-26 19:22:45'), 
(2, 'B', 'A2', 'A', 1, '2015-06-26 20:02:25'), 
(3, 'C', 'A3', 'A', 1, '2015-06-26 20:22:16'), 
(4, 'D', 'A4', 'A', 1, '2015-06-26 20:22:17'), 
(5, 'E', 'W1', 'A', 1, '2015-06-26 20:22:19'), 
(6, 'F', 'W2', 'A', 1, '2015-06-26 20:22:35'), 
(7, 'G', 'W3', 'A', 1, '2015-06-26 20:22:55'); 
(8, 'H', 'W4', 'A', 1, '2015-06-26 20:32:15'), 



mysql> SELECT * FROM `ozbah_users` 
    -> ORDER BY `ozbah_users`.`user_modifiedon` ASC; 
+---------+-----------+---------------+-------------+---------------+----------- 
----------+ 
| user_id | user_name | user_priority | user_status | user_event_id | user_modif 
iedon  | 
+---------+-----------+---------------+-------------+---------------+----------- 
----------+ 
|  1 | A   |    A1 | A   |    1 | 2015-06-26 
22:22:45 | 
|  2 | B   |    A2 | A   |    1 | 2015-06-26 
23:02:25 | 
|  3 | C   |    A3 | A   |    1 | 2015-06-26 
23:22:16 | 
|  4 | D   |    A4 | A   |    1 | 2015-06-26 
23:22:17 | 
|  5 | E   |    W1 | A   |    1 | 2015-06-26 
23:22:19 | 
|  6 | F   |    W2 | A   |    1 | 2015-06-26 
23:22:35 | 
|  7 | G   |    W3 | A   |    1 | 2015-06-26 
23:22:55 | 
|  6 | H   |    W4 | A   |    1 | 2015-06-26 
23:22:35 | 
|  7 | I   |    W5 | A   |    1 | 2015-06-26 

当你看到user_priority有活动或当前玩家Wn 2个值An等待玩家ñ是从1月1日至4日

等待玩家Wn的球员名单队列号

现役球员An没有限制

条件是现役球员是2队

球队1:user_priority A1和A2

队2:user_priority A3和A4

如果队伍输掉比赛,双方球员将移动到等待列表末尾 等待列表中的第一名球员将移动到主动列表的末尾,优胜队将移动到顶端活跃的球员名单上

例如队2输这么A3和A4将移动到末待岗第2名等待名单会去的活动列表末尾

我会改变的球员的名字和user_modifiedon

的主要问题在这里,我想更新(从Active 球员2或4行)和(在等候名单一切都将被转移),这是什么 我需要的!

,因为在这种情况下,我需要为每一行创建一个更新语句

+---------+-----------+---------------+-------------+---------------+----------- 
----------+ 
| user_id | user_name | user_priority | user_status | user_event_id | user_modif 
iedon  | 
+---------+-----------+---------------+-------------+---------------+----------- 
----------+ 
|  1 | A   |    A1 | A   |    1 | 2015-06-26 
22:22:45 | 
|  2 | B   |    A2 | A   |    1 | 2015-06-26 
23:02:25 | 
|  3 | E   |    A3 | A   |    1 | 2015-06-26 
23:22:16 | 
|  4 | F   |    A4 | A   |    1 | 2015-06-26 
23:22:17 | 
|  5 | G   |    W1 | A   |    1 | 2015-06-26 
23:22:19 | 
|  6 | H   |    W2 | A   |    1 | 2015-06-26 
23:22:35 | 
|  7 | I   |    W3 | A   |    1 | 2015-06-26 
23:22:55 | 
|  8 | C   |    W4 | A   |    1 | 2015-06-26 
23:42:18 | 
|  9 | D   |    W5 | A   |    1 | 2015-07-01 
22:32:49 | 
+---------+-----------+---------------+-------------+---------------+----------- 
----------+ 

我已创建它使用2周的ArrayList的Java类似这样的事是java代码

这2个数组列表将包含主动等待玩家

列表

,这是输出

Initial size of current: 0 
Initial size of waiting: 0 
Size of current after additions: 4 
Size of waiting after additions: 2 
Contents of current: [A, B, C, D] 
Contents of waiting: [E, F] 
Contents of current BEFORE Deleting: [A, B, C, D, E, F] 
Size of current BEFORE Deleting: 6 
Contents of waiting BEFORE Deleting: [E, F, A, B] 
Size of waiting BEFORE Deleting: 4 
current.get(0): B 
current.get(0): C 
Contents of current AFTER Deleting: [C, D, E, F] 
Contents of waiting AFTER Deleting: [A, B] 

我的问题是,什么是最好的SQL查询来更新多行,并保持正确的顺序作为我的例子吗?

的主要问题是在这里,我想更新(从Active 球员2或4行)和(在等候名单一切都将被转移),这是什么 我需要的!

谢谢

+0

我要说的是,这个问题太长,在其当前格式。 –

+0

@这里的主要问题是我想更新(来自活动玩家的2行)和(等待列表中的所有内容都将被移动),这就是我需要的! –

+0

您好,请根据[本指南](http://stackoverflow.com/help/mcve)简化您的问题。 – cychoi

回答

1

如果您要删除W2,需要所有的那些更高上下移动,你可以这样做:

SET @delete = 2; 

UPDATE ozbah_users 
SET user_priority = 
    CASE 
     WHEN user_priority LIKE 'W%' AND user_priority < CONCAT('W', @delete) 
      THEN CONCAT('A', SUBSTR(user_priority, 2) + 2 
     WHEN user_priority = CONCAT('W', @delete) 
      THEN -1 
     WHEN user_priority LIKE 'W%' AND user_priority > CONCAT('W', @delete) 
      THEN CONCAT('W', SUBSTR(user_priority, 2) - 2) 
    END 
WHERE user_priority LIKE 'W%' 
+0

正是我需要删除一行,谢谢。 –

+0

使用你的方法是否可以只改变'user_priority'而不是改变每列中的名字?所以对于输家队我把'user_priority'改成等待列表的最后2行,然后等待列表中的前2行将变为A3和A4,最后等待列表将在移动前2后从W3开始,所以我们'将他们从1开始 –

+0

我没有改变任何名字,我只是转移'user_priority'。您可以在'CASE'表达式中添加更多'WHEN'子句来处理其他行,并更改'WHERE'子句以使这些行包含在处理中。 – Barmar