Gibt es so eine Abfrage?
danOne
- datenbank
0 mabu0 danOne
0 Andavos0 Olaf Schneider0 Philipp Hasenfratz0 Klaus Mock0 wahsaga
Guten Abend alle zusammen,
obwohl ich mir fast sicher bin das es nicht geht möchte ich trotzdem nochmal nachfragen weil es mir sooo viel vereinfachen würde.
Also ich habe 5 Tabellen, diese enthalten alle unterschiedliche Felder (logisch!) 5 Felder haben allerdings immer dieselbe bezeichnung (id,preis,bild,hersteller,farbe). Gibt es eine Möglichkeit in einer abfrage über alle 5 Tabellen ein ergebnisstabelle zu erzeugen die diese 5 Felder beinhaltet mit den werten aus allen 5 tabellen?
also sowas wie
SELECT id,preis,bild,hersteller,farbe FROM tab1,tab2,tab3,tab4,tab5
so wie oben geschrieben geht es natürlich nicht weil die feldbezichnungen nicht eindeutig sind aber vielleicht irgendwie anders?
Wie gesagt das ganze MUSS in einer abfrage passieren.
weiß da jemand was?
schönen Gruß
.dan.One.
Hi!
Ich bin kein Profi, aber ich versuchs mal:
SELECT tab1.id, tab1.preis, (...), tab2.id, tab2.preis, (...), tab3.id, (...), tag4.id, (...), tab5.farbe FROM tab1, tab2, tab3, tab4, tab5
ich weiß zwar wirklich nicht, ob das geht (ich glaubs auch nicht), aber es könnte sein
mfg,
mabu
Hi,
ich weiß zwar wirklich nicht, ob das geht (ich glaubs auch nicht), aber es könnte sein
Das geht schon, aber dann hat die ergebnisstabelle 5x5 felder und das ist nicht so ganz das was ich wollte, also würde shcon gehen, ist aber ein enormer mehraufwand.
danke trotzdem
.dan.One.
Hallo,
das geht:
Beispiel 1, man hat nur 1 Zeile zum ausgeben:
<?php
$einstellungen = "einstellungen";
$ein_abfrage = "SELECT * FROM $einstellungen WHERE id LIKE '1'";
$ein_ergebnis = mysql_query($ein_abfrage);
$ein_row = mysql_fetch_object($ein_ergebnis);
$design = "design";
$de_abfrage = "SELECT * FROM $design WHERE id LIKE '1'";
$de_ergebnis = mysql_query($de_abfrage);
$de_row = mysql_fetch_object($de_ergebnis);
?>
Die Eingaben sind jetzt in $ein_row und $de_row gespeichert. So gibt man sie wieder aus:
<?php
echo "ID aus Tabelle 1: $ein_row->id<br>";
echo "ID aus Tabelle 2: $de_row->id<br>";
?>
sonst würde es auch so gehn.
<?php
$eintraege = "einstellungen";
$ein_abfrage = "SELECT * FROM $eintraege ORDER BY id";
$ein_ergebnis = mysql_query($ein_abfrage);
while($ein_row = mysql_fetch_object($ein_ergebnis))
{
$design = "design";
$de_abfrage = "SELECT * FROM $desgin ORDER BY id";
$de_ergebnis = mysql_query($de_abfrage);
while($de_row = mysql_fetch_object($de_ergebnis))
{
echo "ID aus Tabelle 1: $ein_row->id<br>";
echo "ID aus Tabelle 2: $de_row->id<br>";
}
}
?>
So gibt er dann aus beiden Tabellen die Eingaben aus.
Ich hoffe ich konnte dir helfen
MFG
Andavos
Hallo .dan.One.,
mir scheint, dass das Datenbankmodell nicht so geeignet ist. Ich würde die Felder id,preis,bild,hersteller,farbe mit einer zusätzlichen eindeutigen ID versehen(*) und in eine Extratabelle packen. Die fünf alten Tabellen bekommen dann statt der fünf alten Felder ein neues ID-Feld, das auf die ID in der Extratabelle verweist.
Alle alten Anfragen lassen sich jetzt mit einem JOIN lösen und Dein jetztiges Problem reduziert sich auf ein simples SELECT über der Extratabelle.
Gruß Olaf
P.S.:
(*) ist nur nötig, wenn die schon vorhandenen ids aus den alten fünf Tabellen nicht eindeutig sind (d.h. es gibt doppelte).
Halihallo danOne
Also ich habe 5 Tabellen, diese enthalten alle unterschiedliche Felder (logisch!) 5 Felder haben allerdings immer dieselbe bezeichnung (id,preis,bild,hersteller,farbe). Gibt es eine Möglichkeit in einer abfrage über alle 5 Tabellen ein ergebnisstabelle zu erzeugen die diese 5 Felder beinhaltet mit den werten aus allen 5 tabellen?
SELECT *
FROM
tab1 NATURAL JOIN
tab2 NATURAL JOIN
tab3 NATURAL JOIN
tab4 NATURAL JOIN tab5
NATURAL JOIN joined über gleichbenennte Attribute (deine 5 gleichbenannten).
Diese Abfrage gilt für den Fall, dass du die Attribute aus allen 5 Tabellen auslesen
möchtest und zwar so, dass id,preis,bild,hersteller,farbe in der Ergebnistabelle
eineindeutig sind; oder habe ich deine Frage falsch verstanden?
Feldbezeichnungen sind bei einem NATURAL JOIN _immer_ eindeutig.
Beachte den Hinweis von Olaf, der IMHO recht hat bzgl. des Datenmodells.
Viele Grüsse
Philipp
Halihallo zurück
SELECT *
FROM
tab1 NATURAL JOIN
tab2 NATURAL JOIN
tab3 NATURAL JOIN
tab4 NATURAL JOIN tab5
ich hab das jetzt mal so probiert aber dabei kommt nix raus sprich kein ergebniss !?!?!
sieht bei mir jetzt so aus:
SELECT *
FROM
cd NATURAL JOIN
buch NATURAL JOIN
video NATURAL JOIN
mc NATURAL JOIN kalender;
btw: wenn ich den * durch 5 feldbezichnungen ersetze bekomme ich den
"in field list is ambiguous" Fehler
oder habe ich deine Frage falsch verstanden?
ich glaube nicht.
Beachte den Hinweis von Olaf, der IMHO recht hat bzgl. des Datenmodells.
ich weiß, hätte ich eigentloch auch so oder so ähnlich gemacht aber ich habe hier eine fertige DB gekriegt und da ist soviel drin, das es mir jetzt grade zu mühsam ist das alles umzuschaufeln, das meinte ich mit viel arbeit ersparen.
Hab ich mit der anweisung oben was falsch gemacht??
schönen Gruß
.dan.One.
Halihallo danOne
ich hab das jetzt mal so probiert aber dabei kommt nix raus sprich kein ergebniss !?!?!
Nun, dann habe ich deine Aufgabe nicht richtig verstanden. Denn es gibt ein Ergebnis,
eben ein leeres. Falls du dieses nicht erwartest, habe ich einfach nicht genau gewusst,
was du willst. Äm, Das Problem ist schlicht, dass, ich zumindest, keine Ahnung habe, was
du wirklich mit dem Query willst. Ich habe die Aufgabe noch nicht wirklich verstanden.
Frage: War das, was Klaus vorschlug das wonach du suchst (wenn es denn mit mysql ginge)?
btw: wenn ich den * durch 5 feldbezichnungen ersetze bekomme ich den
"in field list is ambiguous" Fehler
Das ist IMHO ein Bug in MySQL. Wenn es nur NATURAL JOIN's in der FROM-Klausel gibt,
ist ein Feldname auch ohne Tabellenprefix immer eindeutig. Gut, ich mag mich irren,
glaube aber gehört zu haben, dass der "SQL-Standard" beim NATURAL JOIN vorschlägt,
dass die Attribute, über die gejoined werden, nur einmal (ohne Tabellenprefix) in der
Ergebnistabelle erscheinen; und die Attribute, die nicht zum joinen herangezogen werden
sind per Definition beim NATURAL JOIN eindeutig.
oder habe ich deine Frage falsch verstanden?
ich glaube nicht.
Aha? - Dann frage ich mich, warum du dich nicht über die leere Ergebnismenge freust,
denn dann hättest du diese erwarten müssen :-)
http://www.mysql.com/doc/en/JOIN.html
Hab ich mit der anweisung oben was falsch gemacht??
Nö, ist korrekt. Aber anscheinend muss man trotzdem mit Tabellenprefixen arbeiten, wenn
man nur einige Spalten selektieren will :-(
Viele Grüsse
Philipp
Hallo,
Gibt es eine Möglichkeit in einer abfrage über alle 5 Tabellen ein ergebnisstabelle zu erzeugen die diese 5 Felder beinhaltet mit den werten aus allen 5 tabellen?
Da Du nicht angegeben hast, mit welchem DBMS Du arbeitest gehe ich davon aus dass es sich um Oracle handelt.
Da sollte doch glatt ein
select feld1, feld2, feld3 feld4, feld5 from tabelle1
union all
select feld1, feld2, feld3 feld4, feld5 from tabelle2
union all
select feld1, feld2, feld3 feld4, feld5 from tabelle3
union all
select feld1, feld2, feld3 feld4, feld5 from tabelle4
union all
select feld1, feld2, feld3 feld4, feld5 from tabelle5
das gewünscht Ergebnis bringen
Falls Du dann doch nicht Oracle einsetzt[1] würde ich die von Olaf angesprochene Änderung des Datenbankdesigns in Erwägung ziehen.
Grüße
Klaus
[1] und selbst wenn Oracle zum Einsatz kommt, sollest Du über eine Änderung des Designs gründlich nachdenken.[2]
[2] ... und Dir vielleicht für die Zukunft beim Design der Datenbank auch gleich Gedanke über die möglichen Abfragen machen und welche Auswirkung das gewählte Design dann diesbezüglich hat.
Hallo,
Da Du nicht angegeben hast, mit welchem DBMS Du arbeitest gehe ich davon aus dass es sich um Oracle handelt.
Hmm, wie davon als standard ausgehen kann ist mir jetzt nicht so ganz klar. (ist aber ne mysql)
Falls Du dann doch nicht Oracle einsetzt[1] würde ich die von Olaf angesprochene Änderung des Datenbankdesigns in Erwägung ziehen.
habe ich und nehme ich heute in angriff.
[2] ... und Dir vielleicht für die Zukunft beim Design der Datenbank auch gleich Gedanke über die möglichen Abfragen machen und welche Auswirkung das gewählte Design dann diesbezüglich hat.
wie bereits erwähnt es ist nicht mein design, dann wäre sowas bedacht worden.
danke trotzdem.
.dan.One.
Hallo Klaus,
select feld1, feld2, feld3 feld4, feld5 from tabelle1
union all
select feld1, feld2, feld3 feld4, feld5 from tabelle2
[...]
Falls Du dann doch nicht Oracle einsetzt[1]
Das geht auch in MySQL, vorrausgesetzt Du lässt das ALL weg:
SELECT feld1, ..., feld5 FROM tabelle1
UNION
SELECT feld1, ..., feld5 FROM tabelle2
...
Dem Rest des Postings kann ich zustimmen.
Viele Grüße,
Christian
hi,
Also ich habe 5 Tabellen, diese enthalten alle unterschiedliche Felder (logisch!) 5 Felder haben allerdings immer dieselbe bezeichnung (id,preis,bild,hersteller,farbe).
_warum_ hast du solch eine struktur?
alle gleichartigen daten in eine weitere tabelle auszulagern, und über eine eindeutige id eine verknüpfung herzustellen, wäre m.e. sinnvoller.
gruss,
wahsaga