Maison  >  Questions et réponses  >  le corps du texte

"Réécriture de compteur basée sur les partitions"

J'utilise MySQL et PHP avec phpmyadmin. J'ai un problème majeur avec les compteurs basés sur les partitions que j'aimerais améliorer, mais mes connaissances SQL m'en empêchent. Je suis très affligé par cela.

J'aimerais avoir un compteur pour les données en double dans ma table, si la valeur obtient un doublon, elle ajoute un nombre après la valeur et recommence à partir de 1 jusqu'à ce qu'elle rencontre une nouvelle valeur et ainsi de suite. Voici à quoi devrait ressembler le résultat final :

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

J'ai déjà reçu de l'aide avec ce compteur ici, mais il n'a pas fonctionné comme je le souhaitais. Et, lorsque j'appuie sur le bouton insérer dans le formulaire, après avoir rechargé phpmyadmin, le formulaire ressemble à ceci :

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

Que se passe-t-il ici ? Le code que je demande de l'aide pour réécrire est le suivant :

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`

Ce code peut-il être réécrit pour créer une table avec des noms numérotés et des doublons qui ressemble au premier exemple de table et fonctionne correctement dans phpmyadmin ? Toute aide est grandement appréciée. Veuillez garder à l’esprit que je suis un utilisateur SQL intermédiaire en difficulté.

P粉618358260P粉618358260257 Il y a quelques jours447

répondre à tous(1)je répondrai

  • P粉592085423

    P粉5920854232024-01-11 10:44:21

    Solution possible - Déclencheur BEFORE INSERT et table MyISAM supplémentaire avec auto-incrémentation secondaire :

    Table de travail

    Table supplémentaire

    Déclencheur

    Insérer des lignes - l'index AI est ajouté au nom. Vérifiez le résultat.

    Regardez maintenant ce qui est stocké dans la table supplémentaire.

    db<>violon ici


    Si votre table de travail user existe déjà et qu'elle contient des données, vous créerez une table supplémentaire et la remplirez de données en utilisant, par exemple,

    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

    répondre
    0
  • Annulerrépondre