php – 满足条件时的Sql-Exit CASE语句
以下CASE语句在ID = 10的同时更新BET1,BET2,BET3和BET4.
$S1=32 $sql="UPDATE TIMER-BOARD1 set BET1= case when BET1 IS NULL THEN $S1 else BET1 end,BET2= case when BET2 IS NULL THEN $S1 else BET2 end,BET3= case when BET3 IS NULL THEN $S1 else BET3 end,BET4= case when BET4 IS NULL THEN $S1 else BET4 end WHERE ID = 10"; 当我运行php页面时,我有BET1 = 32,BET2 = 32,BET3 = 32,BET4 = 32. 我想要的是让脚本在找到并填充第一个空字段时退出. 即,当ID = 10时,从所有BET1,BET3,BET4 = NULL开始,我想在运行php页面时,仅更新BET1 = 32.当我再次运行时,更新BET2 = 32等. 类似于以下内容: $S1=32 $sql="UPDATE TIMER-BOARD1 set BET1= case when BET1 IS NULL THEN $S1 ( EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET1 end,BET2= case when BET2 IS NULL THEN $S1 (EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET2 end,BET3= case when BET3 IS NULL THEN $S1 (EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET3 end,BET4= case when BET4 IS NULL THEN $S1 (EXIT AND DON’T BOTHER ABOUT OTHER CASE STATEMENTS) else BET4 end WHERE ID = 10"; 结果 Start values: ID=10,BET1=NULL,BET2=NULL,BET3=NULL,BET4=NULL. Run the script 1ST time: ID=10,BET1=32,BET2 =NULL,BET4=NULL. Run the script 2nd time: ID=10,BET2= 32,BET4 = NULL. Run the script 3rd time: ID=10,BET2=32,BET3=32,BET4=NULL. Run the script 4th time: ID=10,BET4=32. Run the script 5th time or more: No null field,so no change. 如何编辑脚本以执行上述功能? 编辑 @ InoS Heo 如果你有时间,最后一个问题. 在运行sql之前我有$S1 = 32.假设不是32我有苏珊,这当然是一个字符串. 如何更新脚本以适应上述字符串? $S1 =susan UPDATE `TIMER-BOARD1` set ID = @UPDATED := 10,BET1 = case when BET1 IS NULL THEN @UPDATED:= susan else BET1 end,BET2 = case when @UPDATED = 10 AND BET2 IS NULL THEN @UPDATED:= susan else BET2 end,… BET4 = case when @UPDATED = 10 AND BET4 IS NULL THEN @UPDATED:= susan else BET4 end WHERE ID = 10; 谢谢. 解决方法
您正在寻找“UPDATE first NULL column”.我认为这可以使用MySQL用户变量来实现.
你能试试吗? 架构&数据 DROP TABLE IF EXISTS `TIMER-BOARD1`; CREATE TABLE `TIMER-BOARD1` ( `ID` int(11) NOT NULL,`BET1` int(11) DEFAULT NULL,`BET2` int(11) DEFAULT NULL,`BET3` int(11) DEFAULT NULL,`BET4` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DELETE FROM `TIMER-BOARD1`; INSERT INTO `TIMER-BOARD1` VALUES (10,NULL,NULL),(10,32,1,2,3,4); 初始数据 SELECT * FROM `TIMER-BOARD1`; +----+------+------+------+------+ | ID | BET1 | BET2 | BET3 | BET4 | +----+------+------+------+------+ | 10 | NULL | NULL | NULL | NULL | | 10 | 32 | NULL | NULL | NULL | | 10 | 1 | 2 | NULL | NULL | | 10 | 1 | 2 | 3 | NULL | | 10 | 1 | 2 | 3 | 4 | +----+------+------+------+------+ UPDATE UPDATE `TIMER-BOARD1` set ID = @UPDATED := 10,-- user defined variable which keep track WHETHERE CHANGED OR NOT BET1 = case when BET1 IS NULL THEN @UPDATED:= 32 else BET1 end,BET2 = case when @UPDATED = 10 AND BET2 IS NULL THEN @UPDATED:=32 else BET2 end,BET3 = case when @UPDATED = 10 AND BET3 IS NULL THEN @UPDATED:=32 else BET3 end,BET4 = case when @UPDATED = 10 AND BET4 IS NULL THEN @UPDATED:=32 else BET4 end WHERE ID = 10; 更新的数据 SELECT * FROM `TIMER-BOARD1`; mysql> SELECT * FROM `TIMER-BOARD1`; +----+------+------+------+------+ | ID | BET1 | BET2 | BET3 | BET4 | +----+------+------+------+------+ | 10 | 32 | NULL | NULL | NULL | | 10 | 32 | 32 | NULL | NULL | | 10 | 1 | 2 | 32 | NULL | | 10 | 1 | 2 | 3 | 32 | | 10 | 1 | 2 | 3 | 4 | +----+------+------+------+------+ 问题 当你想要更新10时仍然有问题. 更新 1.使用一些string_column 我认为你有两个选择 >使用字符串列而不是ID列 >优点:可以使用一个UPDATE实现 >为每行执行UPDATE > pros:即使没有更多的字符串列也可以使用 我想知道你是否有像string_col这样的字符串列,如下所示. 架构&数据 DROP TABLE IF EXISTS tab; CREATE TABLE tab ( `ID` int(11) NOT NULL,`BET1` VARCHAR(100) DEFAULT NULL,`BET2` VARCHAR(100) DEFAULT NULL,`BET3` VARCHAR(100) DEFAULT NULL,`BET4` VARCHAR(100) DEFAULT NULL,`string_col` VARCHAR(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DELETE FROM tab; INSERT INTO tab VALUES (10,'A'),'Alice','B'),'Bob','C'),'Charlie','D'),'Dave','E'); SELECT * FROM tab; +----+-------+------+---------+------+------------+ | ID | BET1 | BET2 | BET3 | BET4 | string_col | +----+-------+------+---------+------+------------+ | 10 | NULL | NULL | NULL | NULL | A | | 10 | Alice | NULL | NULL | NULL | B | | 10 | Alice | Bob | NULL | NULL | C | | 10 | Alice | Bob | Charlie | NULL | D | | 10 | Alice | Bob | Charlie | Dave | E | +----+-------+------+---------+------+------------+ UPDATE UPDATE tab set string_col = @ORIG_STRING_COL := (@UPDATED := string_col),BET1 = IF(BET1 IS NULL,@UPDATED := 'Susan',BET1),BET2 = IF(@UPDATED != 'Susan' AND BET2 IS NULL,BET2),BET3 = IF(@UPDATED != 'Susan' AND BET3 IS NULL,BET3),BET4 = IF(@UPDATED != 'Susan' AND BET4 IS NULL,BET4),string_col = @ORIG_STRING_COL WHERE ID = 10; 结果 SELECT * FROM tab; +----+-------+-------+---------+-------+------------+ | ID | BET1 | BET2 | BET3 | BET4 | string_col | +----+-------+-------+---------+-------+------------+ | 10 | Susan | NULL | NULL | NULL | A | | 10 | Alice | Susan | NULL | NULL | B | | 10 | Alice | Bob | Susan | NULL | C | | 10 | Alice | Bob | Charlie | Susan | D | | 10 | Alice | Bob | Charlie | Dave | E | +----+-------+-------+---------+-------+------------+ 2.为每条记录执行一次UPDATE 使用以下伪代码,您可以实现它. $res = mysqli_query(SELECT pk_column FROM tab WHERE ID = 10); while ($row = mysqli_fetch_assoc($res)) { $pk_col = $row['pk_column']; mysqli_query("SET @UPDATED := ''"); mysqli_query("UPDATE tab SET BET1 = IF(BET1 IS NULL,BET2 = IF(@UPDATED = '' AND BET2 IS NULL,BET3 = IF(@UPDATED = '' AND BET3 IS NULL,BET4 = IF(@UPDATED = '' AND BET4 IS NULL,BET4) WHERE pk_col = $pk_column "); } 前面的代码可以实现客户端或存储过程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |