2015-07-03 28 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