"Penulisan balas berasaskan partition"
P粉618358260
P粉618358260 2024-01-10 17:44:52
0
1
471

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粉618358260
P粉618358260

membalas semua(1)
P粉592085423

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!