Rumah  >  Soal Jawab  >  teks badan

"Penulisan balas berasaskan partition"

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粉618358260P粉618358260257 hari yang lalu445

membalas semua(1)saya akan balas

  • P粉592085423

    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

    balas
    0
  • Batalbalas