Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysql: doppelte einträge in einer Spalte

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mysql: doppelte einträge in einer Spalte

    Hi,
    ich habe eine Mysql-Tabelle, die doppelte Einträge in der Spalte 'name' beinhaltet:
    CREATE TABLE `foo` (
    `name` VARCHAR(50) DEFAULT NULL,
    `number` TINYINT(4) DEFAULT NULL,
    `custom_head` ENUM('ja','nein') NOT NULL DEFAULT 'nein'
    ) ENGINE=MYISAM DEFAULT CHARSET=latin1;
    INSERT INTO foo VALUES('sebasti','1','nein');
    INSERT INTO foo VALUES('sebasti','1','nein');
    INSERT INTO foo VALUES('monrow','2','nein');
    INSERT INTO foo VALUES('monrow','2','nein');
    INSERT INTO foo VALUES('matheo','3','nein');
    INSERT INTO foo VALUES('anna','4','nein');
    INSERT INTO foo VALUES('sebasti','1','nein');
    ich möchte mit SQL-Abfrage die Tabelle durchgehen und für die Doppelten Einträge in der Spalte 'name'
    folgendes tun:
    - Beim ersten Vorkommen nichts tun
    - Beim zweiten, dritten, vierten,... der Wert in der Spalte 'number' inkrementieren.
    Das heißt die Tabelle danach soll so aussehen:
    TRUNCATE TABLE foo;
    INSERT INTO foo VALUES('sebasti','1','nein');
    INSERT INTO foo VALUES('sebasti','2','nein');
    INSERT INTO foo VALUES('monrow','2','nein');
    INSERT INTO foo VALUES('monrow','3','nein');
    INSERT INTO foo VALUES('matheo','3','nein');
    INSERT INTO foo VALUES('anna','4','nein');
    INSERT INTO foo VALUES('sebasti','3','nein');
    Für jede Hilfe bin ich sehr dankbar

    Grüße
    Aha

  • #2
    Ohne ORDER BY gibt es kein "zweiten, dritten, vierten,..." und ohne Primary Key kannst du auch nicht gezielt ein Datensatz updaten den es mehrfach gibt. Du kannst natürlich versuchen mit UPDATE und LIMIT irgendwas zu bauen, aber machs lieber gleich richtig.

    Kommentar


    • #3
      Zitat von erc Beitrag anzeigen
      Ohne ORDER BY gibt es kein "zweiten, dritten, vierten,..." und ohne Primary Key kannst du auch nicht gezielt ein Datensatz updaten den es mehrfach gibt. Du kannst natürlich versuchen mit UPDATE und LIMIT irgendwas zu bauen, aber machs lieber gleich richtig.
      Row_number() wäre eine Lösung. Wenn MySQL das hätte.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Danke,
        ich habe eine Lösung entwickelt. Hier ist sie falls Jmd sie brauchen sollte:
        CREATE TABLE foo_new LIKE foo;
        INSERT INTO foo_new SELECT * FROM foo ORDER BY `name`;
        SET @num:=0;
        SET @spalte:='';
        SELECT IF( F.`name`!=@spalte, CONCAT(@spalte:=F.`name`,'_',@num:=F.`number`), CONCAT(@spalte:=F.`name`,'_',@num:=@num+1) ) AS todo, F.*
        FROM foo_new F;
        Grüße
        Aha

        Kommentar


        • #5
          Moin,

          dachte dafür gibt es die Funktion "DISTINCT"

          Grüße

          Kommentar


          • #6
            Zitat von shermano Beitrag anzeigen
            Moin,

            dachte dafür gibt es die Funktion "DISTINCT"

            Grüße
            Das ist keine Funktion.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von aha_01 Beitrag anzeigen
              Danke,
              ich habe eine Lösung entwickelt.
              Aha

              Die aber nicht das macht, was Du wolltest.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Zitat von akretschmer Beitrag anzeigen
                Row_number() wäre eine Lösung.
                Nein, das wäre nur eine weitere Krücke.

                "Richtig machen", wie erc bereits sagte, wäre die Lösung = PK vergeben - das kann sogar MySQL
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Zitat von lstegelitz Beitrag anzeigen
                  Nein, das wäre nur eine weitere Krücke.

                  "Richtig machen", wie erc bereits sagte, wäre die Lösung = PK vergeben - das kann sogar MySQL
                  Sicher. Nur sehe ich keinen wirklichen Ansatz in MySL, der das Update macht. Der PK kann natürlich als Sortierkriterium und zum Joinen helfen:

                  Code:
                  test=# \d isteglitz;
                                           Table "public.isteglitz"
                   Column |  Type   |                       Modifiers
                  --------+---------+--------------------------------------------------------
                   id     | integer | not null default nextval('isteglitz_id_seq'::regclass)
                   val    | text    |
                   nr     | integer |
                  Indexes:
                      "isteglitz_pkey" PRIMARY KEY, btree (id)
                  
                  test=# select * from isteglitz;
                   id | val | nr
                  ----+-----+----
                    1 | foo |
                    2 | foo |
                    3 | foo |
                    4 | bar |
                    5 | bar |
                    6 | foo |
                    7 | bar |
                    8 | bar |
                    9 | foo |
                  (9 rows)
                  
                  Time: 0,194 ms
                  test=*# update isteglitz set nr = x.row_number from (select id, val, row_number() over (partition by val order by id) from isteglitz) x where isteglitz.id=x.id;
                  UPDATE 9
                  Time: 0,621 ms
                  test=*# select * from isteglitz;
                   id | val | nr
                  ----+-----+----
                    4 | bar |  1
                    5 | bar |  2
                    7 | bar |  3
                    8 | bar |  4
                    1 | foo |  1
                    2 | foo |  2
                    3 | foo |  3
                    6 | foo |  4
                    9 | foo |  5
                  (9 rows)
                  
                  Time: 0,220 ms
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Zitat von akretschmer Beitrag anzeigen
                    Sicher. Nur sehe ich keinen wirklichen Ansatz in MySL, der das Update macht. Der PK kann natürlich als Sortierkriterium und zum Joinen helfen:
                    Mit PK genauso wie du es mit Postgres machst, nur dass row_number() dann ebend so aussieht wie der Query von aha_01 (+noch ein Subquery der Mysqls schreib/lese sperre umgehet).
                    Ohne PK und exakt gleichen Datensätzen könntest du das mit einer Stored Procedure und UPDATE + LIMIT 1 machen. Mit Postgres? So jedenfalls nicht.

                    Ich bin aber auch der Meinung, man muss nicht jeden Mist machen nur weils irgendwie möglich ist. Die Problemstellung klingt für mich als wäre sie an eine anderen Stelle einfach vermeidbar gewessen.

                    Kommentar


                    • #11
                      Zitat von erc Beitrag anzeigen
                      Ohne PK und exakt gleichen Datensätzen könntest du das mit einer Stored Procedure und UPDATE + LIMIT 1 machen. Mit Postgres? So jedenfalls nicht.
                      Man könnte die CTID dafür nutzen, eine sonst nicht sichtbare Spalte. Oder OID, aber klar denkende Menschen nutzen keine OID-Spalte mehr, ist seit 7.x deprecated.

                      Ich bin aber auch der Meinung, man muss nicht jeden Mist machen nur weils irgendwie möglich ist. Die Problemstellung klingt für mich als wäre sie an eine anderen Stelle einfach vermeidbar gewessen.
                      Das mag richtig sein.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar

                      Lädt...
                      X