2015-12-17 8 views
6

Ich möchte eine benutzerdefinierte Spalte als Alias ​​anzeigen, aber müssen mithilfe von Auto-Zeichen erhöhen.So erstellen Sie benutzerdefinierte Spalte mit Auto-Inkrement Zeichen

id  subid dollar packetname 
168  355  5813 ND-1 
169  355  359  ND-1 
170  356  559  ND-2 
171  362  4536 ND-10 
172  362  484  ND-10 
134  329  4698 ND-12 
135  329  435  ND-12 
125  330  6293 ND-13 
126  330  4293 ND-13 
127  330  693  ND-13 

Ich brauche einen Ausgang mit einem anderen aktualisiert Paket. Spalte mit autoincrement Charakter

id  subid dollar packetname  updated packet 
168  355  5813 ND-1   ND-1 
169  355  359  ND-1   ND-1A 
170  356  559  ND-2   ND-2 
171  362  4536 ND-10   ND-10 
172  362  484  ND-10   ND-10A 
134  329  4698 ND-12   ND-12 
135  329  435  ND-12   ND-12A 
125  330  6293 ND-13   ND-13 
126  330  4293 ND-13   ND-13A 
127  330  693  ND-13   ND-13B 
+2

Hmm, nehme 37. Spalte wird 'ND-13Z', was würden Sie 38th sein erwarten? – Timekiller

+0

@Timekiller Nein ich erwarte nichts am 38.. Meine maximale Anforderung ist nur A bis G. –

Antwort

2

Sie solche Abfrage verwenden können

zusätzliches Feld zu machen
SELECT concat(packetname, 
       elt(if(@t=packetname, @n:[email protected]+1, @n:=1), 
        '','A','B','C','D','E','F','G')) `updated packet`, 
     id, subid, dollar, @t:=packetname packetname 
    FROM t 
     cross join 
     (SELECT @n:=1, @t:="") n 
    order by packetname 

demo on sqlfiddle

2

Ich denke, die beste Wahl zu SELECT aus dem aktuellen Paket-Tabelle ist, ist es auf dem Weg zu modifizieren, und INSERT es in eine neue Tabelle. Sobald Sie diesen Vorgang abgeschlossen haben, können Sie die ursprüngliche Tabelle löschen und dann die neue in die alte umbenennen.

INSERT INTO newpacket (id, subid, dollar, packetname, `updated packet`) 
SELECT p1.id, p1.subid, p1.dollar, p1.packetname, p2.`updated packet` 
FROM packet p1 
INNER JOIN 
(
    SELECT p.id, p.subid, 
     CASE WHEN (SELECT p.id - MIN(t.id) FROM packet t WHERE t.subid = p.subid) > 0 
     THEN CONCAT(packetname, 
        CHAR(((SELECT p.id - MIN(t.id) FROM packet t WHERE t.subid = p.subid) + 64) USING utf8)) 
     ELSE packetname END AS `updated packet` 
    FROM packet p 
) p2 
ON p1.subid = p2.subid AND p1.id = p2.id 
+0

Bitte geben Sie diese aktualisierte Abfrage einen Versuch. –

+0

Ist es sicher, auf 'id'/'subid' zu operieren? Was ist, wenn ID-Werte in realen Daten spärlich sind? Was ist, wenn es denselben 'packetname' für verschiedene' subid' gibt? – Timekiller

+0

@TimBiegeleisen es funktioniert immer noch nicht. –

1

Sie können einen Trigger erstellen.

create trigger my_trigger before insert on mytable for each row 
begin 
DECLARE samecount INT; 
    set samecount = (select count(*) from mytable where packetname = new.packetname); 
    if samecount = 0 then 
    set new.updated_packet = new.packetname; 
    else 
    set new.updated_packet = concat(new.packetname,conv(samecount+9,10,36)); 
    end if; 
end; 

Bevor eine neue Zeile eingefügt wird, zählt es, wie viele Zeilen mit gleichen packetname existieren. Wenn es einen oder mehrere gibt, wird die Zählung + 9 in die Basis 36 konvertiert - es ist fast die gleiche wie HEX, außer bis zu Z. Also, wenn count 1 ist, wird es 1+9=10=A. Der resultierende Wert wird mit packetname verkettet. Wenn die gleichen Zeilen den Wert 37 überschreiten, wird kein Fehler auftreten, stattdessen wird stattdessen der Wert 10 für 38 angehängt.

Denken Sie daran, dass dies nicht genau auto increment ist und es könnte Rennbedingungen unterliegen, wenn zwei Benutzer die gleiche packetname in genau der gleichen Zeit einfügen, kann die Zählung Abfrage den gleichen Wert für beide zurückgeben.

EDIT: Beachten Sie, dass diese Lösung für, wenn Sie benötigen neue Zeilen in dieser Tabelle einfügen danach und wollen, dass sie updated_packet automatisch ausgefüllt haben. Wenn Sie auch bestehende Zeilen aktualisieren mögen, ist eine Möglichkeit, eine neue Tabelle mit derselben Struktur zu erstellen, auf eine neue Tabelle, die Trigger erstellen und dann tat

insert into newtable(id, subid, dollar, packetname) 
select id, subid, dollar, packetname from oldtable 
Verwandte Themen