Aus eins mach 2?

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

  • Aus eins mach 2?

    Hallo zusammen,

    ich weiß nicht sorecht wie sich mein Vorhaben schmipft, deshalb versuche ich mal grob hier nieder zu schreiben was ich überhaupt vorhabe.


    Ich habe eine Tabelle Namens "i18n", dort sind meine Multilingualen Texte abgelegt für die Übersetzung der Seite in andere Sprachen.

    Tabellen Struktur:

    Code:
    id | language | keyword | translation
    Das Problem was ich nun habe, ich möchte mir zur Administration beispielsweise 2 Sprachen anzeigen lassen und gleichzeitig bearbeiten.

    Wie bekomme ich nun durch einen Query die Tabellen Spalten folgendermaßen sortiert:

    Code:
    id | keyword | en_translation | de_translation
    Folgenden Ansatz habe ich, welches aber nicht funktioniert, und da liegt mein Problem:

    Code:
    SELECT
       en.id,
       en.keyword,
       en.translation AS en_translation,
       de.translation AS de_translation
    FROM
       i18n AS en,
       i18n AS de
    WHERE
       en.language = 'en'
    AND
       de.language = 'de'
    GROUP BY
       en.keyword,
       de.keyword
    ORDER BY en.id ASC
    Die Spalten id, keyword und en_translation werden soweit ich das überblicken kann korrekt ausgelesen, nur die Spalte de_translation wird immer durch einen X-beliebigen Wert wiederholt.


    Nun die Fragen: ;-)

    Was mache ich falsch?
    Ist der Ansatz des Statements totaler Mist?
    Gibt es eine elegantere Lösung zur Tabellen Struktur?

  • #2
    Code:
    SELECT
      en.id,
       en.keyword,
       en.translation AS en_translation,
       de.translation AS de_translation
    FROM 
      i18n AS en
    LEFT JOIN
      i18n AS de
      ON en.id = de.id
    ORDER BY en.id ASC
    EDIT: Das setzt allerdings voraus, das alle Texte in beiden Sprachen vorhanden sind.

    Mit dem LEFT JOIN wuerden halt alle ids zurueckgegeben, bei denen es einen englischen Text gibt, sollte es eine ID mit deutschem Text aber keiner englsichen Entsprechung geben, so funktioniert das nicht (dann muesste man erst noch eine Abfrage ueber alle IDs dazu angeben).

    Allerdings muesstest du diesen Ansatz wieder ueberarbeiten, wenn du noch weitere Sprachen hinzufuegen willst. Entweder waere der einfacherere Weg die Tabelle mit den beiden entsprechenden Spalten (de_translation und en_translation) anzulegen, oder du solltest es generell offen halten, d.h. das du ggf nicht alles mit einer Abfrage erschlagen kannst (ich hatte ein aehnliches Problem geloest, indem ich die Abfrage von PHP habe zusammenbauen lassen, dadurch konnte ich die Anzahl der Spalten aufgrund einer Abfrage vorher festlegen).

    Zuletzt geändert von Lennynero; 07.03.2008, 13:46.

    Kommentar


    • #3
      Hallo Tobias,

      haben uns ja schon lange nicht mehr gesehen, wie gehts dir?

      SELECT
      en.id,
      en.keyword,
      en.translation AS en_translation,
      de.translation AS de_translation
      FROM
      i18n AS en
      INNER JOIN i18n AS de ON en.keyword = de.keyword
      WHERE
      en.language = 'en'
      AND
      de.language = 'de'
      GROUP BY
      en.keyword
      ORDER BY en.id ASC

      so sollte es funktionieren, du hast die Tabelle beim Selfjoin ja über garkeinen Parameter richtig verknüpft.


      Gruß
      Daniel
      signed oder unsigned... das ist hier die Frage

      Kommentar


      • #4
        Dir fehlt doch der join der tabellen, dann sollte es funktionieren.
        Beantworte nie Threads mit mehr als 15 followups...
        Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

        Kommentar


        • #5
          jetzt hast du 2 halb richtige lösungen (ist mir nach dem posten aufgefallen)


          Die Lösung von Lennynero ist wohl besser, da du so auch die Englischen ohne deutsche übersetzung bekommen würdest. Allerdings kannst du den self-join nicht über die ID machen.


          Code:
          SELECT
             en.id,
             en.keyword,
             en.translation AS en_translation,
             de.translation AS de_translation
          FROM 
            i18n AS en
          LEFT JOIN
            i18n AS de ON en.id = de.id
          WHERE de.language = 'de'
              AND en.language = 'en'
          ORDER BY en.id ASC
          so bekommst du alle Englischen mit oder ohne deutsche übersetzung (kommt halt drauf an ob eine da ist)
          signed oder unsigned... das ist hier die Frage

          Kommentar


          • #6
            Original geschrieben von case
            so bekommst du alle Englischen mit oder ohne deutsche übersetzung (kommt halt drauf an ob eine da ist)
            Perfekt! Wobei falls keine Deutsch übersetzung vorhanden ist, automatisch auf die Default Language geswitcht wird.

            Original geschrieben von case
            Hallo Tobias,
            haben uns ja schon lange nicht mehr gesehen, wie gehts dir?
            Danke der nachfrage, ich kann micht nicht beklagen,! :-) Wie läuft bei euch so?

            Kommentar


            • #7
              Code:
              SELECT
                DISTINCT id.id,
                 id.keyword,
                 en.translation AS en_translation,
                 de.translation AS de_translation
              FROM 
                i18n AS id
              LEFT JOIN
                i18n AS en
                ON id.id = en.id
              LEFT JOIN
                i18n AS de
                ON id.id = de.id
              ORDER BY en.id ASC
              EDIT (schon wieder ): manchmal vermisse ich einen FULL OUTER JOIN bei MySQL!

              Kommentar


              • #8
                Was ist denn ID?
                Evt. muss der join über keyword gehen...
                Beantworte nie Threads mit mehr als 15 followups...
                Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                Kommentar


                • #9
                  so, beim 3. Anlauf nun noch mehr richtigstellungen

                  Code:
                  SELECT
                     en.id,
                     en.keyword,
                     en.translation AS en_translation,
                     de.translation AS de_translation
                  FROM 
                    i18n AS en
                  LEFT JOIN
                    i18n AS de ON en.keyword = de.keyword
                  WHERE en.language = 'en'
                      AND (de.language = 'en' OR de.language IS NULL)
                  ORDER BY en.id ASC
                  signed oder unsigned... das ist hier die Frage

                  Kommentar


                  • #10
                    Code:
                    SELECT 
                           en.id, 
                           en.keyword, 
                           en.translation AS en_translation, 
                           de.translation AS de_translation 
                        FROM  
                          i18n AS en 
                        LEFT JOIN 
                          i18n AS de ON en.keyword = de.keyword 
                        WHERE en.language = 'en' 
                            AND (de.language = 'de' OR de.language IS NULL) 
                        ORDER BY en.id ASC
                    This one works fine for me! :-)

                    Danke!!

                    Kommentar


                    • #11
                      Die Lösung des Problems wurde hier ja schon gesagt. Ich möchte dir vielleicht einfach noch eine ander Möglichkeit aufzeigen.
                      Ich benutze pro Sprache eine eigene Tabelle, texte_de, texte_en, etc die nur jeweils die Atribute id und inhalt enthalten. Für den Zugriff aus den Programmen benutze ich dann eine Funktion, die jeweils den Text in der gewünschten Sprache zurückgibt.
                      Das hat den Vorteil, dass man ohne Programmänderung eine neue Sprache hinzufügen kann, ausschliesslich durch das Hinzufügen einer neuen Tabelle, z.B. texte_fr und einem zusätzlichen Eintrag in der Tabelle sprachen
                      Diese Seite basiert auf diesem Prinzip.
                      Gruss
                      H2O

                      Kommentar


                      • #12
                        warum nicht eine tabellemit folgender struktur:
                        id | keyword | translation_de | translation_en | translation_fr

                        so hast du deine übersetzungen in einem datensatz auf einen blick und brauchst keine joins
                        it's not a bug,
                        it's a feature!

                        Kommentar


                        • #13
                          Und was ist wenn ich noch mehr Sprachen einfügen möchte, ohne das ich an der DB rumfummeln muss?

                          Kommentar


                          • #14
                            *push*

                            Code:
                            SELECT 
                                   en.id, 
                                   en.keyword, 
                                   en.translation AS en_translation, 
                                   de.translation AS de_translation 
                                FROM  
                                  i18n AS en 
                                LEFT JOIN 
                                  i18n AS de ON en.keyword = de.keyword 
                                WHERE en.language = 'en' 
                                    AND (de.language = 'de' OR de.language IS NULL) 
                                ORDER BY en.id ASC
                            Wenn ich nun aber keine Einträge mit der language "de" habe, werden auch keine Englischen mehr angezeigt, warum?
                            Zuletzt geändert von Skaschy; 07.03.2008, 14:53.

                            Kommentar


                            • #15
                              Original geschrieben von Lennynero
                              EDIT: Das setzt allerdings voraus, das alle Texte in beiden Sprachen vorhanden sind.

                              Mit dem LEFT JOIN wuerden halt alle ids zurueckgegeben, bei denen es einen englischen Text gibt, sollte es eine ID mit deutschem Text aber keiner englsichen Entsprechung geben, so funktioniert das nicht (dann muesste man erst noch eine Abfrage ueber alle IDs dazu angeben).

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X