Rumah > Soal Jawab > teks badan
Saya menggunakan mysql dan php dengan phpmyadmin. Saya mempunyai masalah besar dengan pembilang berasaskan partition yang saya ingin perbaiki, tetapi pengetahuan sql saya menghalang saya daripada berbuat demikian. Saya sangat tertekan dengan ini.
Saya ingin mempunyai pembilang untuk data pendua dalam jadual saya, jika nilai mendapat pendua ia menambah nombor selepas nilai dan bermula semula dari 1 sehingga ia menemui nilai baharu dan seterusnya. Begini rupa keputusan akhir:
--------------------------- 1 | Josh-1 --------------------------- 2 | Josh-2 -------------------------- 3 | Josh-3 -------------------------- 4 | Josh-4 -------------------------- 5 | Fred-1 -------------------------- 6 | Fred-2 -------------------------- 7 | Fred-3 -------------------------
Saya pernah mendapat bantuan dengan kaunter ini di sini sebelum ini, tetapi ia tidak berfungsi seperti yang saya mahu. Dan, apabila saya menekan butang sisip dalam borang, selepas memuat semula phpmyadmin, borang kelihatan seperti ini:
--------------------------- 1 | Josh-1-1-1 --------------------------- 2 | Josh-2 -------------------------- 3 | Josh-3 -------------------------- 4 | Josh-4 -------------------------- 5 | Fred-1 -------------------------- 6 | Fred-2 -------------------------- 7 | Fred -------------------------
Apa yang berlaku di sini? Kod yang saya minta bantuan menulis semula ialah ini:
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`
Bolehkah kod ini ditulis semula untuk mencipta jadual dengan nama bernombor dan pendua yang kelihatan seperti contoh jadual pertama dan berfungsi dengan baik dalam phpmyadmin? Segala bantuan amat kami hargai. Sila ingat bahawa saya adalah pengguna sql perantaraan yang bermasalah.
P粉5920854232024-01-11 10:44:21
Penyelesaian yang mungkin - SEBELUM INSERT pencetus dan jadual MyISAM tambahan dengan autoincrement sekunder:
Meja kerja
Meja tambahan
Pencetus
Sisipkan baris - indeks AI ditambahkan pada nama. Semak hasilnya.
Lihat apa yang disimpan dalam jadual tambahan sekarang.
db<>fiddle di sini
Jika jadual kerja anda user
sudah wujud, dan ia mengandungi beberapa data, maka anda akan membuat jadual tambahan dan mengisinya dengan data menggunakan, sebagai contoh,
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