2017-03-03 1 views
0

ich eine Reihe von doppelten Benutzernamen haben zum Beispiel zwei Benutzer benannt werden „goku“ und 3 Benutzer sind Namen „sliceoflife“ usw.Concat inkrementelle INT am Ende des doppelten Benutzernamen

Ich weiß, das ist ziemlich einfach zu tun in PHP, aber gibt es eine Möglichkeit, eine inkrementelle Integer direkt in MySQL zu concat.

Ergebnis sollte mir geben zum Beispiel wieder

goku goku1 sliceoflife sliceoflife1 sliceoflife2 und so weiter ...

wäre noch besser, wenn ich die Inkrementierung auf der Date Spalte DateLastActive basiert.

+0

Bitte geben Sie die Tabelle Aussage mit einigen Beispieldaten –

+1

erstellen teilen Wenn 'username' für die Anmeldung ist es wahrscheinlich sowieso einen' UNIQUE' Index verwendet wird haben sollte. – CD001

+0

@ CD001 das sind migrierte Daten, die ich versuche zu korrigieren. – TopCheese

Antwort

0

sollte in der Lage sein, es so zu laufen (wo id Ihren Autowert darstellt)

UPDATE table SET 
username = CONCAT(username, id) 
+0

Ich schätze die Antwort, obwohl dies nicht das Ergebnis ist, nach dem ich gefragt habe. – TopCheese

0

Tabelle/Insert-Daten erstellen.

CREATE TABLE USER (
    NAME VARCHAR(255) DEFAULT NULL 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

INSERT INTO USER (NAME) VALUES('goku'); 
INSERT INTO USER (NAME) VALUES('goku'); 

INSERT INTO USER (NAME) VALUES('sliceoflife'); 
INSERT INTO USER (NAME) VALUES('sliceoflife'); 
INSERT INTO USER (NAME) VALUES('sliceoflife'); 

Abfrage

SELECT * FROM USER 

Ergebnis

name   
------------- 
goku   
goku   
sliceoflife 
sliceoflife 
sliceoflife 

Diese mit Benutzervariablen möglich ist.

Abfrage

SELECT 
    * 
    , (
     CASE 
     WHEN 
      @user = User.name 
     THEN 
      @rank := @rank + 1 

     WHEN 
      @user != User.name 
     THEN 
      @rank := '' 

     END 
    ) 
     AS 
     rank 
    , @user := User.name 
    FROM 
    USER 
    CROSS JOIN ( 
    SELECT 
     @user := '' 
    , @rank := '' 
    ) 
    AS 
    init_user_vars 
    ORDER BY 
    User.name ASC 

Ergebnis

name   @user := '' @rank := '' rank @user := User.name 
----------- ----------- ----------- ------ -------------------- 
goku           goku     
goku         1  goku     
sliceoflife         sliceoflife   
sliceoflife       1  sliceoflife   
sliceoflife       2  sliceoflife   

es jetzt einfach Namen und Rang Concat. Sie müssen die obige Abfrage als ausgelieferte Tabelle verwenden.

SELECT 
    (
    CASE 
    WHEN rank IS NOT NULL 
    THEN CONCAT(NAME, rank) 

    WHEN rank IS NULL 
    THEN CONCAT(NAME) 
    END 
    ) 
    AS 
    NAME 
FROM ( 

    SELECT 
    * 
    , (
     CASE 
     WHEN 
      @user = User.name 
     THEN 
      @rank := @rank + 1 

     WHEN 
      @user != User.name 
     THEN 
      @rank := '' 

     END 
    ) 
     AS 
     rank 
    , @user := User.name 
    FROM 
    USER 
    CROSS JOIN ( 
    SELECT 
     @user := '' 
    , @rank := '' 
    ) 
    AS 
    init_user_vars 
    ORDER BY 
    User.name 
) 
    AS 
    user_ranked 

Ergebnis

name   
-------------- 
goku   
goku1   
sliceoflife 
sliceoflife1 
sliceoflife2 
+0

Ich werde dieses Dankeschön versuchen. – TopCheese