MySQL: Feldnamen aus Tabelle zuweisen
AndreD
- datenbank
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
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
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
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
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
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
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. 1umfrage_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. 19Ich möchte das eine Query dieser Tabelle einer Umfrage folgendes liefert:
Frage Yoga Chi Gong Bodyworkout
Welche Stunde(...) 22 41 19Diese 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 = 2Fehlermeldung: 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
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