phpmyadmin 按分区重写计数器

ifmq2ha2  于 2022-11-09  发布在  PHP
关注(0)|答案(1)|浏览(166)

我使用mysql和php与phpmyadmin。我有一个基于分区的计数器的主要问题,我不想改善,但我的SQL知识阻止我这样做。我很挣扎与此有关。
我希望表中的重复数据有一个计数器,如果某个值得到了重复值,该计数器会在该值后面添加一个数字,然后从1重新开始,直到遇到新值为止,依此类推。

---------------------------
1  | Josh-1
---------------------------
2  | Josh-2
--------------------------
3  | Josh-3 
--------------------------
4  | Josh-4 
--------------------------
5  | Fred-1 
--------------------------
6  | Fred-2
--------------------------
7  | Fred-3
-------------------------

我以前在这里得到过关于这个计数器的帮助,但是它没有像我希望的那样工作。而且当我在表单中按下插入按钮时,在我重新加载它之后,表在phpmyadmin中看起来像这样

---------------------------
1  | Josh-1-1-1
---------------------------
2  | Josh-2
--------------------------
3  | Josh-3 
--------------------------
4  | Josh-4 
--------------------------
5  | Fred-1 
--------------------------
6  | Fred-2
--------------------------
7  | Fred
-------------------------

这是怎么回事?我寻求帮助重写的代码是这样的

UPDATE usermeta u1,
(SELECT
u1.`id`, CONCAT(u1.`name`,'-',ROW_NUMBER() OVER(PARTITION BY u1.`name` ORDER BY u1.`id`)) newname
FROM 
usermeta u1 JOIN (SELECT `name` , COUNT(*) FROM usermeta GROUP BY `name` HAVING COUNT(*) > 1) u2
ON u1.`name` = u2.`name` ) u3
SET u1.`name` = u3.`newname`
WHERE u1.`id` = u3.`id`

这段代码是否可以重写,这样它就可以创建一个带有编号的名称和重复项的表,看起来像第一个表示例,并像在phpmyadmin中一样工作?非常感谢所有的帮助。请记住,我是一个正在努力的普通sql用户。

e7arh2l6

e7arh2l61#

可能得解决方案- BEFORE INSERT触发器与附加得MyISAM表(带有辅助自动增量):
一种工作台

CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,
                   name VARCHAR(127));

附加表

CREATE TABLE user_index (id INT AUTO_INCREMENT,
                         name VARCHAR(127),
                         PRIMARY KEY (name, id)) ENGINE=MyISAM;

触发器

CREATE TRIGGER insert_user_index
BEFORE INSERT ON user
FOR EACH ROW
BEGIN
    DECLARE new_index INT;
    INSERT INTO user_index (name) VALUES (NEW.name);
    SET new_index = LAST_INSERT_ID();
    DELETE FROM user_index WHERE name = NEW.name AND id < new_index;
    SET NEW.name = CONCAT_WS('-', NEW.name, new_index);
END

插入行-将AI索引添加到名称中。检查结果。
第一个
看看现在附加表中存储了什么。
一个

  • db〈〉小提琴

如果您工作表user已经存在,并且它包含一些数据,那么您需要创建一个附加表,并使用以下命令填充数据,例如:

CREATE TABLE user_index (id INT AUTO_INCREMENT,
                         name VARCHAR(127),
                         PRIMARY KEY (name, id)) ENGINE=MyISAM
SELECT MAX(SUBSTRING_INDEX(name, '-', -1) + 0) id,
       SUBSTRING_INDEX(name, '-', 1) name
FROM user
GROUP BY 2;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=38f028cfe1c9e85188ab0454463dcd78

相关问题