如何在MySql列中更新
表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 | 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默认值如何在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 |
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)