Announcement

Collapse
No announcement yet.

Nicht atomare Fremdschlüssel-Aufzählung in Hilfstabelle automatisch fluten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nicht atomare Fremdschlüssel-Aufzählung in Hilfstabelle automatisch fluten

    Hallo,

    ich habe eine mysql-Tabelle mit komma-aufgezählten Fremdschlüsseln:

    tblPosts
    post_name, post_sonstwas, post_kategorien

    und in post_kategorien stehen unterschiedlich viele Fremdschlüssel komma-aufgezählt drin:
    1, 3, 5
    1,66

    usw.

    Die Kategorien sind in einer anderen Tabelle tblKategorien.

    Wie kriege ich nun die nicht-atomaren komma-aufgezählten FS auf die Kategorien in eine Hilfstabelle hinein?

    Hat jemand eine Idee?

    Freundliche Grüße

    CJC

  • #2
    Du müsstest mal genauer beschreiben, was Du machen willst oder Dein Problem ist.
    Aus den Werten im Kategoriefeld eine neue Tabelle mit ID machen? Die Kategoriehilfstabelle besteht doch wahrscheinlich schon`?
    Wenn nicht, die ID allein bringen Dich nicht viel weiter.

    Eine Datenmodeländerung, die die Werte des Kategoriefelds normalisiert?

    ..
    Gruß, defo

    Comment


    • #3
      Originally posted by caiusjuliuscaes View Post
      Hallo,

      ich habe eine mysql-Tabelle
      falsches Forum

      mit komma-aufgezählten Fremdschlüsseln:
      Falsches Design.

      Comment


      • #4
        falsches Forum
        verschoben
        Christian

        Comment


        • #5
          Originally posted by caiusjuliuscaes View Post

          und in post_kategorien stehen unterschiedlich viele Fremdschlüssel komma-aufgezählt drin:
          1, 3, 5
          1,66

          usw.

          Die Kategorien sind in einer anderen Tabelle tblKategorien.

          Wie kriege ich nun die nicht-atomaren komma-aufgezählten FS auf die Kategorien in eine Hilfstabelle hinein?

          Wäre es PostgreSQL, ginge sowas:

          Code:
          test=# create table muell (id int, fs text);
          CREATE TABLE
          Time: 14,621 ms
          test=*# insert into muell values (1, '1,3,5');
          INSERT 0 1
          Time: 0,327 ms
          test=*# insert into muell values (2, '1,66');
          INSERT 0 1
          Time: 0,143 ms
          test=*# select id, regexp_split_to_table(fs,',')::int from muell ;
           id | regexp_split_to_table
          ----+-----------------------
            1 |                     1
            1 |                     3
            1 |                     5
            2 |                     1
            2 |                    66
          (5 rows)
          Aber ich denke, MySQL bietet sowas nicht.

          Comment


          • #6
            Hallo,

            erst einmal danke an alle.
            Mein Problem würde wohl in PostgreSQL mit regexp_split_to_table(fs,',') lösbar sein, wie akretschmer geschrieben hat, aber wie in mysql???

            Ich habe einmal ein Komplettbeipiel zusammengetackert
            Code:
            # Neue DB 
            DROP DATABASE IF EXISTS gurke;
            
            # DB nutzen
            USE gurke;
            
            # Tabelle anlegen
            CREATE TABLE tblPosts
            (
            pid INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
            ueberschrift VARCHAR(64),
            inhalt TEXT,
            kategorien TEXT 
            );
            
            CREATE TABLE tblKategorien
            (
            kid INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
            name VARCHAR(64)
            );
            
            CREATE TABLE tblP2K
            (
            p2kid INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
            pid INTEGER, # Fremdschlüssel auf Posts
            kid INTEGER # Fremdschlüssel auf Kategorien
            );
            
            # Tabelle füllen
            INSERT INTO tblPosts(ueberschrift, inhalt, kategorien) VALUES 
            ('Bla', 'Blas Blubb', '1,2,3,4'),
            ('Bla', 'Blas Blubb', '1,2,3  '),
            ('Bla', 'Blas Blubb', '1,  3,4'),
            ('Bla', 'Blas Blubb', '  2,3,4'),
            ('Bla', 'Blas Blubb', '1,2,  4'),
            ('Bla', 'Blas Blubb', '      4');
            
            INSERT INTO tblKategorien(name) VALUES 
            ('Gurkensalat-Kategorie'),
            ('Fleischsalat-Kategorie'),
            ('Chicoreesalat-Kategorie'),
            ('Feldsalat-Kategorie'),
            ('Wurstsalat-Kategorie'),
            ('Sonstwassalat-Kategorie');
            Ich würde gern so etwas als Ergebnis erzeugen:
            Code:
            INSERT INTO tblP2K(pid, kid) SELECT id, regexp_split_to_table(kategorien,',') FROM tblPosts
            so daß folgender Inhalt in tblP2K entsteht
            Code:
            SELECT pid, kid FROM tblP2K:
            
            pid, kid
            1,1
            1,2
            1,3
            1,4
            2,1
            2,2
            2,3  
            3,1
            3,3
            3,4
            4,2
            4,3
            4,4
            5,1
            5,2
            5,4
            6,4
            Konkret; Wie kann ich in mysql, ähnlich wie mit PostgreSQL (regexp_split_to_table(fs,',')) die komma-aufgezählten Fremdschlüssel in eine Hilfstabelle auslagern (Normalformen)?

            Gruß, CJC

            Comment


            • #7
              Originally posted by caiusjuliuscaes View Post

              Konkret; Wie kann ich in mysql, ähnlich wie mit PostgreSQL (regexp_split_to_table(fs,',')) die komma-aufgezählten Fremdschlüssel in eine Hilfstabelle auslagern (Normalformen)?

              Gruß, CJC

              Blattsalat schmeckt besser, wenn man ihn kurz vor Verzehr gegen Gulasch austauscht. MySQL funktioniert besser, wenn man es kurz vor Benutzung gegen PostgreSQL austauscht ;-)

              Comment


              • #8
                Schlechtes Design, Blattsalat schmeckt besser, .. usw
                ach ja und herzlich willkommen, aber such Dir besser ein anderes Forum und natürlich eine bessere Datenbank, hier gibt man sich nicht mit so Dreck ab (hast ja schon viele wertvolle Hinweise erhalten)

                Ernst:
                Vielleicht hilft dir das hier:
                http://stackoverflow.com/questions/1...split-a-column
                Der substring_index Ansatz ist vielleicht schnell und einfach, falls nicht zuviele Werte in der Spalte stehen.
                Die weiterführenden Links sind vielleicht auch interessant, hab ich nicht verfolgt.
                Gruß, defo

                Comment

                Working...
                X