AndreD: MySQL: Feldnamen aus Tabelle zuweisen

Hallo zusammen,

Tabellen:

umfrage
---------------------------------
Feld        Typ             Inhalt
id          bigint(14)      z.B. 2
frage       text            z.B. Welche Stunde soll samstags...
enddatum    date            z.B. 2004-02-01
erstellt_am datetime        z.B. 2004-01-03 18:33:32
aktiv       tinyint(1)      z.B. 1

umfrage_optionen
----------------------------------
Feld        Typ             Inhalt
id          bigint(14)      z.B. 4
umfrage_id  bigint(14)      z.B. 2
opt_1       varchar(255)    z.B. Yoga
erg_1       int(11)         z.B. 22
opt_2       varchar(255)    z.B. Chi Gong
erg_2       int(11)         z.B. 41
opt_3       varchar(255)    z.B. Bodyworkout
erg_3       int(11)         z.B. 19

Ich möchte das eine Query dieser Tabelle einer Umfrage folgendes liefert:

Frage               Yoga     Chi Gong    Bodyworkout
Welche Stunde(...)  22       41          19

Diese Query läuft nicht:
SELECT u.frage, uo.erg_1 AS uo.opt_1, uo.erg_2 AS uo.opt_2, uo.erg_3 AS uo.opt_3 FROM umfrage AS u, umfrage_optionen AS uo WHERE u.id = 2

Fehlermeldung: You have an error in your SQL syntax near '.opt_1, uo.erg_2 AS uo.opt_2, uo.erg_3 AS uo.opt_3 FROM umfrage

Geht das so überhaupt, hab ich was falsch geschrieben? In der MySQL-Doku hab ich leider auch nix gefunden. Über einen Link der mit weiterhilft würde ich mich auch schon freuen :-)

Also ich möchte mit AS nicht einen "statischen" Feldnamen vergeben, sondern es sollen die Namen der opt_*-Felder als Feldnamen für die entsprechenden erg_*-Felder benutzt werden.
Ich dachte das geht mit einer Query, zur Not nehm ich halt zwei Abfragen und lasse erst die opt_*-Felder ausgeben und nehm die dann in die andere Abfrage als Feldnamen rein.

Ich hoffe das Ganze ist irgendwie verständlich erläutert?

Gruss AndreD

  1. yo,

    das erste, was mir aufgefallen ist, das möglicherweise deine tabellenlogik ein wenig unglücklich ist. nicht das es ihr schlecht geht, aber du hasst den sinn ein wenig verdreht. so wie du es darstellst, soll es eine 1:n beziehung zwischen den beiden geben, also eine Frage kann mehrere optionen haben. so weit so gut. aber dann fängst du an zu "mogeln", indem du für drei unterschiedliche optionen jeweils zwei spalten in der zweiten tabelle erstellt hast. die 1:n beziehung kann das aber schon von hause aus viel eleganter wiedergeben. dann kann die anzahl der optionnen varieren und ist nicht auf drei begrentzt. wenn ich das richtig verstanden habe, sollte das für die zweite tabelle ausreichen. (meine andere vermutung geht in richtung einer m:n beziehung, aber dazu braucht man mehr infos zu deinen vorgaben)

    umfrage_optionen
    ----------------------------------
    Feld        Typ             Inhalt
    id          bigint(14)      z.B. 4
    umfrage_id  bigint(14)      z.B. 2
    option      varchar(255)    z.B. Yoga
    ergebnis    int(11)         z.B. 22

    Diese Query läuft nicht:
    SELECT u.frage, uo.erg_1 AS uo.opt_1, uo.erg_2 AS uo.opt_2, uo.erg_3 AS uo.opt_3 FROM umfrage AS u, umfrage_optionen AS uo WHERE u.id = 2

    yo, als alias-name (AS) einen spaltenwert zu nehmen, das geht meiner meinung nach nicht. ein spaltenname kommt ja nur einmal vor, es kann aber durchaus mehrere datensätze in deiner abfrage geben und somit hättest du mehr als einen spaltennamen. deine aliase sind auch etwas anderes, nämlich Option 1, Option 2 und Option 3 und Yoga, Chi Gong und Bodyworkout sind die inhalte der datensätze.

    bei der abfrage gibt es noch ein anderes problem. du "joinst" über zwei tabellen. deshalb solltest du in deiner where Bedingungen das auch berücksichtiugen. aonsonsten wird jeder datensatz der ersten tabelle mit jeden datensatz der zweiten verbunden und es kommen mehr datensätze raus, als dir lieb ist, also:

    WHERE u.id = 2 AND u.id = uo.umfrage_id

    Geht das so überhaupt, hab ich was falsch geschrieben? In der MySQL-Doku hab ich leider auch nix gefunden. Über einen Link der mit weiterhilft würde ich mich auch schon freuen :-)

    in den dokus steht in aller regel auch nicht, was alles nicht geht, sondern was geht. das würde den rahmen einer jeden doku sprengen. also besser schauen, wie es geht und dann verstehen, warum mein weg nicht geht. ;-)

    Also ich möchte mit AS nicht einen "statischen" Feldnamen vergeben, sondern es sollen die Namen der opt_*-Felder als Feldnamen für die entsprechenden erg_*-Felder benutzt werden.

    das bekommst du auch hin, aber wie oben beschrieben, bringst du spaltennamen mit inhalt durcheinander. deine ergebnis-tabelle auf id=2 könnte in etwas so aussehen.

    Frage   Option Ergebniss
    2.       Yoga      15
    2.       Gong      20
    2.       Body      14

    in welcher form du diese tabelle nun ausgibst, ist dir überlassen und hat nur bedingt mit den alias-namen zu tun. so könnte man alle option der 2. frage auch nebeneinander schreiben und die spaltenüberschrifetn weglassen. das würde in etwa deinen gesuchten entsprechen.

    Ilja

    1. Hey Ilja,

      das erste, was mir aufgefallen ist, das möglicherweise deine tabellenlogik ein wenig unglücklich ist.

      Mhh, zugeben habe ich das Datenbankmodell nicht wirklich ausgiebig durchdacht. Ich hab da wohl ein wenig geschludert. Jetzt bei der konkreten Anwendung sind mir da auch Zweifel gekommen :-)

      yo, als alias-name (AS) einen spaltenwert zu nehmen, das geht meiner meinung nach nicht. (...)

      FullACK und sehr gut erklärt! Siehste, jetzt geht mir auch ein Kronleuchter auf warum das nicht gehen kann und warum es somit auch nicht in der Doku steht :-)

      in welcher form du diese tabelle nun ausgibst, ist dir überlassen und hat nur bedingt mit den alias-namen zu tun. (...)

      Ich werde das einfach nochmal mal ein wenig überarbeiten...

      Danke & Gruss AndreD

      1. Hi,

        Ich werde das einfach nochmal mal ein wenig überarbeiten...

        Konkret heisst das, dass ich bei der umfrage_optionen wohl mein Hirn gestern Nacht überanstrengt habe. Wenn ich nun anstatt den opt_* und erg_* Felder z.B. nur options_name und options_erg nehme habe ich ja eine saubere 1:n-Beziehung, nää? Mann, mann, ich glaub ich sollte nachts nimmer solange arbeiten :-)

        Nochmal vielen Dank für Deine Anregungen und Erklärungen!

        Grüsse AndreD

      2. yo,

        Mhh, zugeben habe ich das Datenbankmodell nicht wirklich ausgiebig durchdacht. Ich hab da wohl ein wenig geschludert. Jetzt bei der konkreten Anwendung sind mir da auch Zweifel gekommen :-)

        also das ist nicht alles schlecht, der grundgedanke ist schon sehr gut. aber nachdem du den ersten schritt getan hast, bist du auf halben weg wieder umgekehrt.

        das was du in der zweiten tabelle gemacht hast, nämlich der versuch eine anzahl von unterschiedlichen optionen darzustellen, das machen viele schon in der ersten tabelle. der sinn, das alles in eine zweite tabelle zu "schieben", liegt ja gerade darin, dass man dadurch eine beliebige anzahl von optionen abbilden kann. also nicht nur drei, sondern auch nur eine oder zehn.

        kopf hoch und weiter dran bleiben. das war schon knapp an einer guten lösung, fehlte nur noch ein wenig fein tuning. ;-)

        Ilja

        1. Hi Ilja,

          das was du in der zweiten tabelle gemacht hast, nämlich der versuch eine anzahl von unterschiedlichen optionen darzustellen, das machen viele schon in der ersten tabelle. (...)

          Inzwischen hab ich es glaub ich gebacken bekommen :-)

          kopf hoch und weiter dran bleiben. das war schon knapp an einer guten lösung, fehlte nur noch ein wenig fein tuning. ;-)

          Wenn ich Dir jetzt sage das ich schon komplexere Modelle als das entworfen und umgesetzt habe glaubst Du mir das eh nicht :-)))
          Trotzdem vielen Dank für Deine Unterstützung, auch im Bezug auf Deine erste Antwort wegen den Feldinhalten als Aliase!

          Schönen Sonntag noch,
          Gruss AndreD

  2. Hallo zusammen,

    Tabellen:

    umfrage

    Feld        Typ             Inhalt
    id          bigint(14)      z.B. 2
    frage       text            z.B. Welche Stunde soll samstags...
    enddatum    date            z.B. 2004-02-01
    erstellt_am datetime        z.B. 2004-01-03 18:33:32
    aktiv       tinyint(1)      z.B. 1

    umfrage_optionen

    Feld        Typ             Inhalt
    id          bigint(14)      z.B. 4
    umfrage_id  bigint(14)      z.B. 2
    opt_1       varchar(255)    z.B. Yoga
    erg_1       int(11)         z.B. 22
    opt_2       varchar(255)    z.B. Chi Gong
    erg_2       int(11)         z.B. 41
    opt_3       varchar(255)    z.B. Bodyworkout
    erg_3       int(11)         z.B. 19

    Ich möchte das eine Query dieser Tabelle einer Umfrage folgendes liefert:

    Frage               Yoga     Chi Gong    Bodyworkout
    Welche Stunde(...)  22       41          19

    Diese Query läuft nicht:
    SELECT u.frage, uo.erg_1 AS uo.opt_1, uo.erg_2 AS uo.opt_2, uo.erg_3 AS uo.opt_3 FROM umfrage AS u, umfrage_optionen AS uo WHERE u.id = 2

    Fehlermeldung: You have an error in your SQL syntax near '.opt_1, uo.erg_2 AS uo.opt_2, uo.erg_3 AS uo.opt_3 FROM umfrage

    Ich erlaube mir mal nachzufragen:
    Du fragst  ab spalte aus uo erg 1 willst Du haben als spalte aus uo.opt1.

    Die Iren bezeichnen so etwas gern mal als Bullshit.:-)
    $sql="SELECT * FROM umfrage, umfrage_optionen WHERE id=umfrage_id";

    $result = mysql_query($sql,....) ;
    while ($f = mysql_fetch_array($result));
               { foreach($f as $spaltenname => $wert)
                 { print ("$spaltenname:$wert");
                  }

    }

    Geht das so überhaupt, hab ich was falsch geschrieben? In der MySQL-Doku hab ich leider auch nix gefunden. Über einen Link der mit weiterhilft würde ich mich auch schon freuen :-)

    Es geht nicht wie Du ja schon selber festgestellt hast.
    Da Dir scheinbar noch ein ganzer Batzen Grundlagen fehlt empfehle ich  Dir mal folgendes Tutorial.
    http://ffm.junetz.de/members/reeg/

    Also ich möchte mit AS nicht einen "statischen" Feldnamen vergeben, sondern es sollen die Namen der opt_*-Felder als Feldnamen für die entsprechenden erg_*-Felder benutzt werden.
    Ich dachte das geht mit einer Query, zur Not nehm ich halt zwei Abfragen und lasse erst die opt_*-Felder ausgeben und nehm die dann in die andere Abfrage als Feldnamen rein.

    Das verstehe ich nicht ...
    Warum so kompliziert?
    Viele Grüße aus Berlin

    TomIRL

    1. Hi Tom,

      Das verstehe ich nicht ...
      Warum so kompliziert?

      Hab ich auch nicht verstanden, bis heute mittag. Da hab gesehn und erkannt das ich gestern Nacht ein wenig verwirrt war :-) Inzwischen ist alles bene und mir ists auch ein wenig peinlich das ich gepostet hab *g*...

      Gruss Andre