Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySql列中更新_Mysql_Sql_Sql Update - Fatal编程技术网

如何在MySql列中更新

如何在MySql列中更新,mysql,sql,sql-update,Mysql,Sql,Sql Update,表t中有5列X和A、B、C、D。列A、B、C、D是varchar。列X必须显示下一行中有多少重复字符。我需要帮助来更新列X 例如: |ID | X | A | B | C | D | ========================= | 4 | 1 | 7 | J | 7 | Q | | 3 | 2 | K | Q | 8 | 8 | | 2 | 3 | 7 | 8 | 9 | J | next row X=3 | 1 | 0 | 7 | J | 8 | K | 0 default |ID |

t中有5列XABCD。列ABCD是varchar。列X必须显示下一行中有多少重复字符。我需要帮助来更新列X

例如:

|ID | X | A | B | C | D | ========================= | 4 | 1 | 7 | J | 7 | Q | | 3 | 2 | K | Q | 8 | 8 | | 2 | 3 | 7 | 8 | 9 | J | next row X=3 | 1 | 0 | 7 | J | 8 | K | 0 default |ID | X | A | B | C | D| ========================= |4 | 1 | 7 | J | 7 | Q| |3 | 2 | K | Q | 8 | 8| |2 | 3 | 7 | 8 | 9 | J |下一行X=3 |1 | 0 | 7 | J | 8 | K | 0默认值
ID-1是第一行,X默认为零,从这里开始计算ID-2和X=3,因为我们有ID-1“7”“J”和“8”,下一行ID-2有ID-1中的组合“7 8 9 J”,其中“7 J 8-”,X应该是3。价值观​​X的值可以在0到4之间。ID-3,X=2“--8 8”,因为在ID-2中有组合“7 8 9 J”,而在“K Q 8 8”中我有8-两次

示例中的
X
值来自“下一行”,而不是前一行。假设您有一个自动递增的id,您可以通过查看下一行来计算此信息。您可以生成查询以进行计算:

select ((case when t1.A in (tnext.A, tnext.B, tnext.C, tnext.D) then 1 else 0 end) +
        (case when t1.B in (tnext.A, tnext.B, tnext.C, tnext.D) then 1 else 0 end) +
        (case when t1.C in (tnext.A, tnext.B, tnext.C, tnext.D) then 1 else 0 end) +
        (case when t1.D in (tnext.A, tnext.B, tnext.C, tnext.D) then 1 else 0 end)
       ) as X, t1.*
from (select t.*, (select max(id) from table t2 where t2.id > t.id) as nextid
      from table t
     ) t1 left outer join
     t tnext
     on tnext.id = t1.nextid;
根据您使用的数据库的不同,此代码可以简化并以不同的方式表达。此外,具体的更新语法可能取决于数据库。

Added:08/06

原始答复:08/05 如何使用
tmp
表,将每个
A
B
C
D
列存储到单行中。这使得我们可以轻松地计算
X
值。 下面的代码假定
id
是顺序值。如果没有,请告诉我还有其他问题

CREATE TABLE tab
(
    id INT,
    X INT,
    A CHAR(1),
    B CHAR(1),
    C CHAR(1),
    D CHAR(1)
);

INSERT INTO tab VALUES (1, 0, '7', 'J', '8', 'K');
INSERT INTO tab VALUES (2, 0, '7', '8', '9', 'J');
INSERT INTO tab VALUES (3, 0, 'K', 'Q', '8', '8');
INSERT INTO tab VALUES (4, 0, '7', 'J', '7', 'Q');

CREATE TABLE tmp
(
    id INT,
    alnum CHAR(1)
);

INSERT INTO tmp SELECT id, A FROM tab;
INSERT INTO tmp SELECT id, B FROM tab;
INSERT INTO tmp SELECT id, C FROM tab;
INSERT INTO tmp SELECT id, D FROM tab;

UPDATE tab INNER JOIN (
    SELECT t1.id AS id, COUNT(*) AS cnt
    FROM tmp t1 INNER JOIN tmp t2 ON t1.id + 1 = t2.id
        AND t1.alnum = t2.alnum
    GROUP BY t1.id
) tmp3 ON tab.id = tmp3.id + 1
SET tab.X = tmp3.cnt;

mysql> SELECT * FROM tab ORDER BY id DESC;
+------+------+------+------+------+------+
| id   | X    | A    | B    | C    | D    |
+------+------+------+------+------+------+
|    4 |    1 | 7    | J    | 7    | Q    |
|    3 |    2 | K    | Q    | 8    | 8    |
|    2 |    3 | 7    | 8    | 9    | J    |
|    1 |    0 | 7    | J    | 8    | K    |
+------+------+------+------+------+------+
4 rows in set (0.00 sec)

我不知道X是如何计算的。你能编辑这个问题并提供更多细节吗。还要注意,在SQL中,没有“前一行”。您需要一个id或时间戳来指定顺序。并且,用您正在使用的数据库标记问题。请澄清如何计算X以及上一行是什么意思?数据库中有27000多行,X必须介于0和4之间。不幸的是,计算不好。@HaydayWxy我无法访问office网络中的dropbox。请将您的数据发布到@HaydayWxy上好吗?@HaydayWxy出于安全原因,所有文件共享站点都被阻止在office上:(@HaydayWxy我发现了一个问题。列中有重复的值。例如)
id=38
行具有
B
C
具有相同的
Q
。我会尽力解决的。很好,非常好,谢谢!!!您可以修复第二个脚本中“select((case when t1.A in(tnext.A,…)”的问题吗?再次感谢。您好,我尝试了,但在计算中出错。在“表1”中的“X”列中,计算是正确的。在这里,我更改了,但在6行id-6为1后仍然计算不正确-正确为2。
CREATE TABLE tab
(
    id INT,
    X INT,
    A CHAR(1),
    B CHAR(1),
    C CHAR(1),
    D CHAR(1)
);

INSERT INTO tab VALUES (1, 0, '7', 'J', '8', 'K');
INSERT INTO tab VALUES (2, 0, '7', '8', '9', 'J');
INSERT INTO tab VALUES (3, 0, 'K', 'Q', '8', '8');
INSERT INTO tab VALUES (4, 0, '7', 'J', '7', 'Q');

CREATE TABLE tmp
(
    id INT,
    alnum CHAR(1)
);

INSERT INTO tmp SELECT id, A FROM tab;
INSERT INTO tmp SELECT id, B FROM tab;
INSERT INTO tmp SELECT id, C FROM tab;
INSERT INTO tmp SELECT id, D FROM tab;

UPDATE tab INNER JOIN (
    SELECT t1.id AS id, COUNT(*) AS cnt
    FROM tmp t1 INNER JOIN tmp t2 ON t1.id + 1 = t2.id
        AND t1.alnum = t2.alnum
    GROUP BY t1.id
) tmp3 ON tab.id = tmp3.id + 1
SET tab.X = tmp3.cnt;

mysql> SELECT * FROM tab ORDER BY id DESC;
+------+------+------+------+------+------+
| id   | X    | A    | B    | C    | D    |
+------+------+------+------+------+------+
|    4 |    1 | 7    | J    | 7    | Q    |
|    3 |    2 | K    | Q    | 8    | 8    |
|    2 |    3 | 7    | 8    | 9    | J    |
|    1 |    0 | 7    | J    | 8    | K    |
+------+------+------+------+------+------+
4 rows in set (0.00 sec)