2015-07-03 3 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 имеет 2 значения An для активных или текущих игроков Wn для ожидающих игроков п это номер очереди из списка игроков

Активные игроки An от 1 до 4

ожидания игроков Wn от 1 до каких-либо ограничений

условие, что Активные игроки 2 команды

команда 1: user_priority A1 и A2

команда 2: user_priority A3 и A4

Если команда проиграет игру, то оба игрока перейдут в конец списка ожидания, и первые 2 игрока в списке ожидающих перейдут в конец активного списка, и команда победителя переместится в начало в списке активных игрока

, например, команда 2 проигрывает так A3 и A4 будет двигаться к концу списка ожидания и первые 2 названия списка ожидания будут идти к концу активного списка

Я просто изменю имя игроков и user_modifiedon

Основной проблемой здесь является то, что я хочу, чтобы обновить (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 | 
+---------+-----------+---------------+-------------+---------------+----------- 
----------+ 

У меня есть создать его подобную вещь в Java с помощью 2 ArrayLists как это код Java

Эти 2 ArrayList будут содержать список активных и ожидающий игроков

public class ArrayListDemo { 

    public static void main(String[] args) { 

     // create an array list 
     ArrayList current = new ArrayList(); 
     ArrayList waiting = new ArrayList(); 

     // Display size 
     System.out.println("Initial size of current: " + current.size()); 
     System.out.println("Initial size of waiting: " + waiting.size()); 

     // add elements to the current array list 
     current.add("A"); 
     current.add("B"); 
     current.add("C"); 
     current.add("D"); 
     System.out.println("Size of current after additions: " + current.size()); 

     // add elements to the waiting array list 
     waiting.add("E"); 
     waiting.add("F"); 
     System.out.println("Size of waiting after additions: " + waiting.size()); 

     // display the array list 
     System.out.println("Contents of current: " + current); 
     System.out.println("Contents of waiting: " + waiting); 

     // Remove elements from current array list 

     current.add(waiting.get(0)); 
     current.add(waiting.get(1)); 

     System.out.println("Contents of current BEFORE Deleting: " + current); 
     System.out.println("Size of current BEFORE Deleting: " + current.size()); 


     waiting.add(current.get(0)); 
     waiting.add(current.get(1)); 

     System.out.println("Contents of waiting BEFORE Deleting: " + waiting); 
     System.out.println("Size of waiting BEFORE Deleting: " + waiting.size()); 


     current.remove(0); 
     System.out.println("current.get(0): "+current.get(0)); 
     current.remove(0); 

     System.out.println("current.get(0): "+current.get(0)); 

     System.out.println("Contents of current AFTER Deleting: " + current); 

     waiting.remove(0); 
     waiting.remove(0); 

     System.out.println("Contents of waiting AFTER Deleting: " + waiting); 



    } 

} 

и это выход

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-запрос для обновления нескольких строк и сохранить последовательность правильно, как мой пример?

Основной проблемой здесь является то, что я хочу, чтобы обновить (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, и, наконец, список ожидания начнется с W3 после перемещения первых 2, поэтому мы 'сдвигаю их, чтобы начать с 1 –

+0

Я не меняю никаких имен, я только меняю 'user_priority'. Вы можете добавить дополнительные выражения 'WHEN' в выражение' CASE' для обработки других строк и изменить предложение WHERE, чтобы эти строки были включены в обработку. – Barmar

Смежные вопросы