danOne: Gibt es so eine Abfrage?

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.

  1. 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

    1. 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.

  2. 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

    --
    http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
  3. 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).

  4. 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

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. 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.

      1. 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

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
  5. 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.

    1. 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.

    2. 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

  6. 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