Antman: mysql

Guten Tag,

als ich damals mit php/myadmin anfing hatte ich noch nicht so die Ahnung vom Tabellendesign. Nun soll eine Tabelle umgestellt werden.

Es handelt sich dabei um eine Tabelle mit Sprachen als Spalten. 'Keyval' ist dabei der Index auf Deutsch und die Spalten stellen die Übersetzungen dar.

Die Tabelle 'translation' sieht folgendermaßen aus:

keyval |de | en | fr | es | it | el

Ein typischer Eintrag wäre:

apfel | Apfel |apple | irgendwas | irgendwas | irgendwas

Nun brauche ich aber nicht jede Spalte ausgefüllt.

Ich möchte die Tabelle aber so haben:

id | lang | keyval | trans

Dann sähe ein Eintrag z.B. so aus:

1 | de | apfel | Apfel
2 |en | apfel | apple
...

Wie macht man das ? Habe keine Lust die Tabelle von Hand neu zu erstellen.

Folgendes habe ich ohne Erfolg probiert:

INSERT INTO translation1 (id, lang, keyval, trans) FROM
(
(SELECT 'NULL', de, keyval, de FROM translation WHERE de NOT IS NULL) UNION
(SELECT 'NULL', en, keyval, en FROM translation WHERE en NOT IS NULL) UNION
(SELECT 'NULL', fr, keyval, fr FROM translation WHERE fr NOT IS NULL) UNION
(SELECT 'NULL', it, keyval, fr FROM translation WHERE it NOT IS NULL) UNION
(SELECT 'NULL', es, keyval, fr FROM translation WHERE es NOT IS NULL) UNION
(SELECT 'NULL', el, keyval, fr FROM translation WHERE el NOT IS NULL)
)

Wer weiß Rat ?

  1. Hallo,

    wäre da nicht ein kleines php-Script ratsam, welches einmal
    value | de
    ausliest und vorhandene Einträge in dem neuen Format sichert, um dann mit
    value | en
    value | fr

    etc. genau so zu verfahren ?

    Dauert ja nicht so lang, sowas zu coden.

    Gruß,
    Stefan

    1. Aber das muss doch mit sql locker gehen. Weiß nicht wie, aber warum das Rad neu erfinden ? Das ganze in simple php Befehle aufzuspalten würde keinen Lerneffekt bringen. ;)

      Vielleicht weiß ja doch jemand wie das nur in sql geht.

      1. klar geht das auch mit sql, wenn dus willst, aber willst du das ich das für dich mache? dann haste auch keinen lerneffekt :D

        1. klar geht das auch mit sql, wenn dus willst, aber willst du das ich das für dich mache? dann haste auch keinen lerneffekt :D

          Warum denn das nicht ? Das nennt man in der Psychologie 'Modellernen'!

          1. Also ich mache dir hier mal nen Muster:

            1. Du erstellst mit 'CREATE TABLE' die neue Tabelle.
            2. Du liest mit 'SELECT * FROM' aus der alten Tabelle die Spalten aus.
            3. Du schreibst mit 'INSERT INTO' die alten Einträge in die neue.

            Wenn du das jetzt im PHPMyAdmin Testest, und ausprobierst, wirst du schnell auf ein Ergebniss kommen! Spiele einfach ein bisschen mit den Befehlen herrum, bis du dein gewünschtes Ergebniss hast.

            mfg perox (www.programming-time.de)

  2. Also, ich würde ein PHP Script schreiben, dass eine neue Tabelle erstellt und die einträge aus der alten in die neue einträgt.

    dürfte ja kein Problem sein oder? ;)

    mfg perox @ www.programming-time.de

  3. Hi,

    Folgendes habe ich ohne Erfolg probiert:

    INSERT INTO translation1 (id, lang, keyval, trans) FROM
    (
    (SELECT 'NULL', de, keyval, de FROM translation WHERE de NOT IS NULL) UNION
    (SELECT 'NULL', en, keyval, en FROM translation WHERE en NOT IS NULL) UNION
    (SELECT 'NULL', fr, keyval, fr FROM translation WHERE fr NOT IS NULL) UNION
    (SELECT 'NULL', it, keyval, fr FROM translation WHERE it NOT IS NULL) UNION
    (SELECT 'NULL', es, keyval, fr FROM translation WHERE es NOT IS NULL) UNION
    (SELECT 'NULL', el, keyval, fr FROM translation WHERE el NOT IS NULL)
    )

    ein paar Fehler/Ungenauigkeiten:

    1. ausgehend davon, dass du das Feld 'id' deiner Tabelle translation1 auf auto_increment gesetzt hast, brauchst du das Feld id gar nicht angeben (abgesehen davon, dass du es als String angibst, 'NULL' anstatt NULL).
    2. das Schlüsselwort FROM in der ersten Zeile ist IMHO falsch. Richtige Syntax:

    INSERT INTO
        tabellenname (spaltenname,...)
    SELECT
        ...
    3. der zweite Wert bei den SELECTS muss jeweils der String 'de', 'en', usw. sein, nicht der Wert der Spalte de, en, usw.

    Also (ungetestet):

    INSERT INTO
        translation1 (lang,keyval,trans)
    SELECT
        'de',keyval,de FROM translation WHERE (de NOT IS NULL)
    UNION SELECT
        ...

    Gruß,
    Andreas.

    1. Hallo Andreas,

      INSERT INTO translation1 (lang, keyval, trans)
      (
      SELECT 'de',keyval,de FROM translation WHERE (de NOT IS NULL)
      UNION
      SELECT 'en',keyval,en FROM translation WHERE (en NOT IS NULL)
      UNION
      SELECT 'fr',keyval,fr FROM translation WHERE (fr NOT IS NULL)
      UNION
      SELECT 'it',keyval,it FROM translation WHERE (it NOT IS NULL)
      UNION
      SELECT 'es',keyval,es FROM translation WHERE (es NOT IS NULL)
      UNION
      SELECT 'el',keyval,el FROM translation WHERE (el NOT IS NULL)
      UNION
      SELECT 'nl',keyval,nl FROM translation WHERE (nl NOT IS NULL))

      Gibt den Fehler:

      MySQL meldet:
      #1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS  NULL  )
      UNION
      SELECT  'en', keyval, en
      FROM translation
      WH

      1. Einen Fehler habe ich gefunden:

        Es muss heißen "IS NOT NULL" anstatt "NOT IS NULL":

        INSERT INTO translation1 (lang, keyval, trans)
        (
        SELECT 'de',keyval,de FROM translation WHERE (de IS NOT NULL) UNION
        SELECT 'en',keyval,en FROM translation WHERE (en IS NOT NULL) UNION
        SELECT 'fr',keyval,fr FROM translation WHERE (fr IS NOT NULL) UNION
        SELECT 'it',keyval,it FROM translation WHERE (it IS NOT NULL) UNION
        SELECT 'es',keyval,es FROM translation WHERE (es IS NOT NULL) UNION
        SELECT 'el',keyval,el FROM translation WHERE (el IS NOT NULL) UNION
        SELECT 'nl',keyval,nl FROM translation WHERE (nl IS NOT NULL)
        )

        Klappt aber immer noch nicht.

        1. Hi,

          Es muss heißen "IS NOT NULL" anstatt "NOT IS NULL":

          jau - hab ich übersehen.

          Klappt aber immer noch nicht.

          was für eine Fehlermeldung kommt denn jetzt?

          Gruß,
          Andreas.

          1. was für eine Fehlermeldung kommt denn jetzt?

            MySQL meldet:
            #1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION
            SELECT  'en', keyval, en
            FROM translation
            WHERE ( en IS

            1. Hi,

              #1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION
              SELECT  'en', keyval, en
              FROM translation
              WHERE ( en IS

              ja - das liegt an der Klammerung, die hat da nichts zu suchen. So hat es bei mir funktioniert:

              INSERT INTO
                  translation1 (lang, keyval, trans)
              SELECT 'de',keyval,de
                  FROM translation WHERE (de IS NOT NULL)
              UNION SELECT 'en',keyval,en
                  FROM translation WHERE (en IS NOT NULL)
              UNION SELECT 'fr',keyval,fr
                  FROM translation WHERE (fr IS NOT NULL)
              UNION SELECT 'it',keyval,it
                  FROM translation WHERE (it IS NOT NULL)
              UNION SELECT 'es',keyval,es
                  FROM translation WHERE (es IS NOT NULL)
              UNION SELECT 'el',keyval,el
                  FROM translation WHERE (el IS NOT NULL)
              UNION SELECT 'nl',keyval,nl
                  FROM translation WHERE (nl IS NOT NULL)

              Gruß,
              Andreas.

              1. Hallo Andreas,

                es lag wirklich an den Klammern. Vielen, vielen Dank.
                Sehr nett von dir.

                Gruß

                Antman