Php MySQL使用条件更新多个行和列
我正在开发一个程序,对任何4人视频游戏的玩家进行排队 这是我的表格结构:Php MySQL使用条件更新多个行和列,php,mysql,sqlite,sql-update,sql-insert,Php,Mysql,Sqlite,Sql Update,Sql Insert,我正在开发一个程序,对任何4人视频游戏的玩家进行排队 这是我的表格结构: 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_even
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\u priority
对于活动或当前玩家有两个值An
Wn
对于等待玩家n是玩家列表的队列号
活动玩家An
从1到4
等待玩家Wn
从1到无限制
条件是,活跃玩家为2支球队
第1组:user\u优先级
A1和A2
第2组:user\u优先级
A3和A4
如果球队输掉比赛,两名球员将进入等待名单的末尾,
等待名单中的前2名球员将移动到活动名单的末尾,优胜者将移动到活动名单的顶部
例如,第2队输了,因此A3和A4将移动到等待名单的末尾,等待名单的前两名将移动到活动名单的末尾
我只需更改玩家名称和用户\u修改名
这里的主要问题是,我想更新(活动列表中的2或4行)
玩家)和(等待名单中的所有内容都将被转移)这就是
我需要
因为在这种情况下,我需要为每一行创建一个update语句
+---------+-----------+---------------+-------------+---------------+-----------
----------+
| 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代码
这两个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行)
玩家)和(等待名单中的所有内容都将被转移)这就是
我需要
谢谢如果要删除
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%'
SET@delete=2;
更新ozbah_用户
设置用户\u优先级=
案例
当用户优先级如“W%”和用户优先级CONCAT('W',@delete)时
然后CONCAT('W',SUBSTR(用户优先级,2)-2)
结束
其中用户的优先级为“W%”
我想说,这个问题在当前格式中太长。@这里的主要问题是我想更新(活动玩家的2行)和(等待列表中的所有内容都将被移动)这就是我需要的!您好,请根据简化您的问题。请不要使用换行方式发布您的表数据。这会使您无法将其粘贴到sqlfiddle。@Barmar我现在将使用sql查询编辑它,这正是我删除一行所需的内容,谢谢。使用您的方法是否可以只移动用户\u优先级
,而不移动chan在每一列中输入姓名?因此对于失败者团队,我将用户的优先级更改为等待列表的最后两行,然后等待列表中的前两行将更改为A3和A4,最后等待列表将在移动前两行后从W3开始,所以我们将它们从1开始。我不会更改任何名称,我只是更改user_priority
。您可以在CASE
表达式中添加更多的WHEN
子句来处理其他行,并更改WHERE
子句,以便将这些行包括在处理中。我已更新了答案以显示更多案例。您可能需要添加更多案例来更改原始An。好的,让我试试,我了解该方法以及如何处理user\u priority
中的数字并将其移动,但如何知道等待列表的最后一个数字,因为我将在等待最后一个数lint之后编辑两个失败者的user\u priority
。如果最后一个数字是W5,那么两个失败者将是W6和W7,那么我将进行移动..如何获得最后的n棕色