hawkmaster: Abfrage machbar?

Hallo zusammen,

es gibt zwei MySQL Tabellen:

Tabelle info:
----------------------------------
infoid infolabel infoname languageid
1,      Vorname,        feld1,          1
2,      Nachname,       feld2,          1
3,      Stadt,          feld3,          1
4,      Plz,            feld4,          1

Tabelle infodaten:
-------------------------------------------------
datenid   feld1, feld2, feld3, feld4, auftragsid
1,        Karl,  Meier, Köln,  22222, 1

Das ergebnis sollte wie folgt aussehen:

Vorname Karl
Nachname Meier
Stadt Köln
Plz 22222

Mit zwei SQL Abfragen und späteren Zusammenbau in PHP bekomme ich das hin.
Mich würde interessieren, ob man dies auch mit einer einzigen Abfrage hinbekommen kann?

vielen Dank und viele Grüße
hawk

  1. Tach!

    Mit zwei SQL Abfragen und späteren Zusammenbau in PHP bekomme ich das hin.
    Mich würde interessieren, ob man dies auch mit einer einzigen Abfrage hinbekommen kann?

    Nein. Du willst ja von einem Feldinhalt zu einem Bezeichner kommen. MySQL kenne kein eval() als Funktion. Du kannst aber ähnlich wie in PHP einen Statement-String erstellen und den über PREPARE und EXECUTE ausführen.

    dedlfix.

    1. moin,

      Mich würde interessieren, ob man dies auch mit einer einzigen Abfrage hinbekommen kann?

      Nein. Du willst ja von einem Feldinhalt zu einem Bezeichner kommen.

      ich wüßte jetzt nicht, warum es nicht mit einer abfrage gehen sollte, schließlich sind ja die bezeichner teil der datenbank, wenn ich es richtig verstanden habe....

      Ilja

      1. Tach!

        ich wüßte jetzt nicht, warum es nicht mit einer abfrage gehen sollte, schließlich sind ja die bezeichner teil der datenbank, wenn ich es richtig verstanden habe....

        Das geht nur, wenn der Vorname stets in "feld1" und auch nichts anderes in diesem Feld steht. Dann braucht man aber auch die Tabelle "info" nicht und kann gleich "feld1" in "infodaten" befragen, wenn man einen Vornamen haben will.

        dedlfix.

        1. moin,

          Das geht nur, wenn der Vorname stets in "feld1" und auch nichts anderes in diesem Feld steht. Dann braucht man aber auch die Tabelle "info" nicht und kann gleich "feld1" in "infodaten" befragen, wenn man einen Vornamen haben will.

          grundsätzlich sollte es auch gehen, wenn der vorname woanders als in Feld1 steht, solange korrekt angegeben ist, in welchen feld der vorname den steht. so "undynamisch" ist nun sql auch wieder nicht.

          Ilja

          1. Tach!

            grundsätzlich sollte es auch gehen, wenn der vorname woanders als in Feld1 steht, solange korrekt angegeben ist, in welchen feld der vorname den steht. so "undynamisch" ist nun sql auch wieder nicht.

            Wenn die Information, in welchem Feld der abzufragende Wert steht, in einem Feld einer anderen Tabelle steht, dann wüsste ich nicht, wie man ohne einen Eval-Ersatz aus einem Feldinhalt einen Bezeichner macht.

            dedlfix.

            1. Hallo zusammen,

              nur nochmals als Ergänzung:
              Die Bezeichner "feld1", "feld2" ... sind immer gleich.
              Der "infolabel" kann allerding unterschiedlich sein.

              Im Admin Bereich wird quasi diese Tabelle befüllt:
              Tabelle info:
              ----------------------------------
              infoid infolabel infoname languageid
              1,      Vorname,        feld1,          1
              2,      Nachname,       feld2,          1
              3,      Stadt,          feld3,          1
              4,      Plz,            feld4,          1

              sie könnte auch so aussehen:
              Tabelle info:
              ----------------------------------
              infoid infolabel infoname languageid
              1,      Automarke,        feld1,          1
              2,      Pflanze,       feld2,          1
              3,      Tier,          feld3,          1
              4,      Farbe,            feld4,          1

              Der Anwender schreibt sieht dann später nur die "infolabel" und ein leeres Textfeld daneben. Seine Daten werden dann in der Tabelle "infodaten" gespeichert.

              Tabelle infodaten:
              -------------------------------------------------
              datenid   feld1, feld2, feld3, feld4, auftragsid
              1,        Karl,  Meier, Köln,  22222, 1

              Ist nicht so schlimm. Mich hat es einfach interessiert. Ich hatte es mit Subselect und mit Join probiert bin aber nie auf eine Lösung gekommen.

              vielen Dank und viele Grüße
              hawk

  2. Tach!

    Nochmal gelesen, denke ich, hab ich dein Anliegen verstanden. Zuerst dachte ich, du hast ein paar Labels, und willst dazu die passenden Daten haben, die sich in irgendeinem der Felder feld1 bis feld4 befinden können. Stattdessen möchtest du aber primär die "infodaten" befragen und dazu die Label anzeigen.

    Das ergebnis sollte wie folgt aussehen:

    Vorname Karl
    Nachname Meier
    Stadt Köln
    Plz 22222

    Und das vermutlich für jeden abzufragenden Datensatz der infodaten-Tabelle.

    Mit zwei SQL Abfragen und späteren Zusammenbau in PHP bekomme ich das hin.
    Mich würde interessieren, ob man dies auch mit einer einzigen Abfrage hinbekommen kann?

    Allerdings hast du in der einen Tabelle die Daten "nebeneinander" (in einem Datensatz) und in der anderen "untereinander" (in 4 Datensätzen). Dazu brauchst du meines Erachtens 4 Joins. Die info muss 4x an infodaten gejoint werden, für jedes der felder feld1..4 einmal. Damit ergibt sich dann ein Ergebnisdatensatz mit den Informationen aus den folgenden Feldern:

    i1.infolabel, infodaten.feld1, i2.infolabel, infodaten.feld2, i3.infolabel, infodaten.feld3, i4.infolabel, infodaten.feld4

    i1 bis i4 sind die 4 Joins der info-Tabelle. Mit den Joins hast du einen ziemlichen Aufwand, nur um die Labels mit dabeistehen zu haben. Der lohnt sich meiner Meinung nach nur dann, wenn du Infodaten unterschiedlicher Couleur in einer Ergebnismenge haben möchtest. Wenn hingegen die Bedeutungen von feld1 bis feld4 in der Ergebnismenge immer dieselben sind, kommst du einfacher mit zwei Abfragen und indem du für die Ausgabe über PHP die Bezeichnung zum Feldinhalt dazuschreibst.

    dedlfix.