Guma: MySQL -> Zwei Tabellen in Abhänigkeit auslesen.

Hallo zusammen,

ich habe eine Datenbank vorliegen in der zwei Tabellen angelegt wurden:

Tabelle1: idfirma, name, adresse
Tabelle2: id, idfirma, kurztext, langtext, angebote

Sprich: in Tabelle 1 sind die Kontaktdaten drin und in Tabelle 2 die Inhalte (Texte)

Über die idfirma kann ich beide Tabellen ansprechen, denn die ist eindeutig zugeordnet: z.B. idfirma=21

Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
idfirma, name, adresse, kurztext, langtext und angebote.

Gibts da was von SQL oder auch ein SELECT-Beispiel?

Guma

  1. hi,

    Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
    idfirma, name, adresse, kurztext, langtext und angebote.

    Gibts da was von SQL oder auch ein SELECT-Beispiel?

    Du möchtest dich über JOINs informieren.

    Im SELFHTML-Raum gibt es zwei sehr aufschlussreiche Feature-Artikel dazu:
    Einführung: JOINs und Fortgeschrittene Jointechniken

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Noch ne Frage zu den fortgeschrittenen Joins:

      Ich habe jetzt drei Tabellen, die über jeweils ein TabellenFeld "id_firma" verknüpft sind.

      meine drei Tabellen mit Felder:
      .01 Tabelle logo_firma:
      li_id | li_name

      .02 Tabelle logo_leistungen:
      id_firma | leistungen

      .03 Tabelle logo_form:
      id_firma | beschreibung

      li_id und id_firma haben pro Kunden eine Zuordnung z.B. 21 und gehören damit zusammen.

      jetrzt mein selectversuch:

      SELECT
          li_id
          li_name
          t1.id_firma,
          leistungen,
          beschreibung
      FROM (logo_form AS t1
      INNER JOIN logo_leistungen AS t2
      ON t1.id_firma = t2.id_firma)
      INNER JOIN logo_firma
      ON t1.id_firma = logo_firma.li_id

      MySQL meldet:
      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't1 . id_firma ,  leistungen , beschreibung  FROM ( logo_form AS t1  IN' at line 1

      Was mache ich bei der Abfrage falsch? Guma

      1. Hallo

          
        
        > SELECT  
        >     li_id                      -- da fehlt was  
        >     li_name                    -- da auch  
        >     t1.id_firma,  
        >     leistungen,  
        >     beschreibung  
        > FROM (logo_form AS t1  
        > INNER JOIN logo_leistungen AS t2  
        > ON t1.id_firma = t2.id_firma)  
        > INNER JOIN logo_firma  
        > ON t1.id_firma = logo_firma.li_id  
        
        

        Was mache ich bei der Abfrage falsch?

        Sei nicht so sparsam. Spendiere dem Statement ein paar Komma.
        Übrigens: MySQL 4.x und älter ignorieren Klammern :-( (Ich weiß, dass das in meinem Artikel noch fehlt), ich weiß, dass einige meiner Abfragen erst von MySQL 5.x unterstützt werden.

        Welche Version hast Du im Einsatz.

        Freundliche Grüße

        Vinzenz

        1. Hi,

          Sei nicht so sparsam. Spendiere dem Statement ein paar Komma.

          Sei nicht so sparsam. Spendiere dem letzten Wort Deines Satzes noch die Endung "ta". ;-)

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo Forum,

    Tabelle1: idfirma, name, adresse
    Tabelle2: id, idfirma, kurztext, langtext, angebote

    Sprich: in Tabelle 1 sind die Kontaktdaten drin und in Tabelle 2 die Inhalte (Texte)

    Über die idfirma kann ich beide Tabellen ansprechen, denn die ist eindeutig zugeordnet: z.B. idfirma=21

    Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
    idfirma, name, adresse, kurztext, langtext und angebote.

    Gibts da was von SQL oder auch ein SELECT-Beispiel?

    Beispiel:

    SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'

    MfG
    cross

    --

    cheValo Webdesign e.K.
    http://www.chevalo.net
    1. Hallo cross,

      Tabelle1: idfirma, name, adresse
      Tabelle2: id, idfirma, kurztext, langtext, angebote

      Jetzt meine Frage: Wie kann ich die Datenbank am besten mit "Select" auslesen, wenn ich folgende Inhalte benötige:
      idfirma, name, adresse, kurztext, langtext und angebote.

      Gibts da was von SQL oder auch ein SELECT-Beispiel?

      Beispiel:
      SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'

      1. Es fehlen geforderte Spalten: name und adresse
      2. Es fehlt eine notwendige Tabellenangabe: Tabelle1
      3. Es ist eine überflüssige Spalte dabei: id
      4. Diese WHERE-Klausel liefert keinen impliziten Join,
         die einfachen Anführungszeichen wären überflüssig.
      5. Es ist empfehlenswert, die explizite JOIN-Syntax zu verwenden.

      Also vier Fehler und eine Unschönheit.
      Viel sinnvoller ist es, den Verweisen in wahsagas Posting zu folgen.

      Freundliche Grüße

      Vinzenz

      1. Ich verstehe Vinzenz und bedanke mich bei wahsager für den Tipp.

        Geht das in die richtige Richtung?

        SELECT idfirma, name, adresse, id,kurztext, langtext, angebote
        FROM Tabelle1, Tabelle2
        WHERE Tabelle1.idfirma = Tabelle2.idfirma

        Grüße von Guma

        1. hi,

          Geht das in die richtige Richtung?

          SELECT [...] FROM Tabelle1, Tabelle2

          Nein, das bildet ein Kreuzprodukt.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hi wahsaga

            SELECT [...] FROM Tabelle1, Tabelle2

            Nein, das bildet ein Kreuzprodukt.

            Nein, also, was oben steht schon, aber nicht die Query, die gepostet wurde. Es ist eine unschöne Syntax, funktioniert aber und selbst MySQL bildet kein Kreuzprodukt mehr sondern kann es optimieren.

            Gruss Daniela

            1. yo,

              Es ist eine unschöne Syntax, funktioniert aber und selbst MySQL bildet kein Kreuzprodukt mehr sondern kann es optimieren.

              es ist zwar richtig, dass wahsaga die bedingung in der WHERE klausel übersehen hat, aber was du da schreibst ist auch nicht richtig. ein kreuzprodukt ist keine teufelswerkzeug, sondern kann durchaus gewünscht sein. insofern beherscht jedes dbms ein kreuzprodukt, wenn es den gewünscht ist. un daran gibt es dann auch nichts zu optimieren.

              Ilja

              1. Moin!

                es ist zwar richtig, dass wahsaga die bedingung in der WHERE klausel übersehen hat, aber was du da schreibst ist auch nicht richtig. ein kreuzprodukt ist keine teufelswerkzeug, sondern kann durchaus gewünscht sein. insofern beherscht jedes dbms ein kreuzprodukt, wenn es den gewünscht ist. un daran gibt es dann auch nichts zu optimieren.

                Richtig, aber die Syntax "FROM tab1, tab2 WHERE tab1.id=tab2.id" produziert auch in MySQL eben nicht zuerst ein Kreuzprodukt, und filtert dann (im Gegensatz zu "FROM tab1 JOIN tab2 ON tab1.id=tab2.id"), sondern es wird gleich zu einem entsprechenden JOIN hin optimiert.

                Die Lesbarkeit solcher Statements ist hingegen deutlich eingeschränkt, weil man im WHERE eine Mischung aus Join-bedingten Bedingungen und abfragebedingten Bedingungen hat. Eine Trennung, wie sie mit der JOIN-Syntax erfolgt, ist deutlich verständlicher.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. yo,

                  Richtig, aber die Syntax "FROM tab1, tab2 WHERE tab1.id=tab2.id" produziert auch in MySQL eben nicht zuerst ein Kreuzprodukt, und filtert dann (im Gegensatz zu "FROM tab1 JOIN tab2 ON tab1.id=tab2.id"), sondern es wird gleich zu einem entsprechenden JOIN hin optimiert.

                  ok, ich denke da habe ich es einfach falsch interpretiert. ich dachte es geht generell darum, ob dbms noch kreuzprodukte bilden.

                  wobei man dazu sagen muss, dass es eigentlich genau umgekehrt deiner begründung ist. das dbms zieht die JOIN beidnung in die WHERE klausel mit rein. insofern wird keine join bedingung zuerst ausgeführt und dafür die abfrage optimiert. bei oracle ist es unter anderem auch noch so, dass die reihenfolge der joins in umgekehrter reihenfolge der schreibweise ausgeführt wird, also festgelegt ist. ausserdem sollten bestimmte anweisungen in der where klausel vor den joins ausgeführt werden und bei abhängigen Daten ist es auch die verwendung der indexe auf eine tabelle nur beschränkt möglich.

                  Ilja

        2. Moin!

          Ich verstehe Vinzenz und bedanke mich bei wahsager für den Tipp.

          Geht das in die richtige Richtung?

          Du hast PHPMyAdmin (wenn nicht, wird es Zeit, das zu haben), und du kannst ausprobieren, was passiert. Das ist in jedem Fall schneller, als hier nachzufragen, ob ein Statement mit Tabellen, deren Inhalt wir nicht kennen, die Infos liefert, die du willst.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
        3. Hallo

          Geht das in die richtige Richtung?

          SELECT idfirma, name, adresse, id,kurztext, langtext, angebote
          FROM Tabelle1, Tabelle2
          WHERE Tabelle1.idfirma = Tabelle2.idfirma

          Unschön.

          Was hast Du gegen

          SELECT  
              idfirma,  
              name,  
              adresse,  
              kurztext,  
              langtext,  
              angebote  
          FROM Tabelle1 t1  
          INNER JOIN Tabelle2 t2  
          ON t1.idfirma = t2.idfirma
          

          wie Du es in Rouvens Einführung nachlesen kannst. Es ist eine _sehr gute_ Idee, die explizite JOIN-Syntax zu verwenden, weil so sehr schön zwischen JOIN-Bedingungen und Einschränkungen der Ergebnismenge durch die WHERE-Klausel unterschieden wird. Ich finde die resultierenden SQL-Anweisungen viel besser lesbar.

          Laut Deinem Ausgangsposting benötigst Du die Spalte id nicht.

          Freundliche Grüße

          Vinzenz

          1. Hallo Ingrid,

            so nicht! Fertiger Code, fehlerhaft, unkommentiert. Sowas aber auch:-(

            SELECT  
                t1.idfirma,            -- Wenn eine Spalte in mehr als einer Tabelle  
                                       -- vorkommt, ist sie eindeutig zu referenzieren  
                                       -- d.h. Tabellenname.Spaltenname  
                name,  
                adresse,  
                kurztext,  
                langtext,  
                angebote  
            FROM Tabelle1 t1           -- Tabellenaliase sparen Schreibarbeit  
                                       -- und können SQL-Anweisungen lesbarer machen.  
            INNER JOIN Tabelle2 t2     -- Explizite JOIN-Syntax  
            ON t1.idfirma = t2.idfirma
            

            Jetzt sollte der Fehler behoben sein und die Kommentare das Statement verständlicher machen.

            Grüße

            Vinzenz

            1. Danke für das gut kommentierte Beispiel. Ich werde das jaetzt in PHPmyAdmin testen.

              Guma

        4. SELECT A.idfirma, A.name, A.adresse, D.id,D.kurztext, D.langtext,   D.angebote
           FROM Tabelle A, Tabelle D
           WHERE A.idfirma = D.idfirma

          Geht das nicht?
          Versuchs doch mal?!

    2. Ich habe mich gefragt, ob ein Join tatsächlich nötig ist und ich das nicht über eine Abfrage lösen kann.
      Du schreibst:

      SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'

      ich denke:
      das ist schon mal prima. aber meine id ist bei beiden mit "idfirma" gekennzeichnet.

      Auf meine Inhalte aus Tabelle 2 kann ich ja dann gar nicht zugreifen - ich benötige die aber.

      Wie steht es mit join, macht das meine Abfragen langsamer?!

      Guma

      1. Hallo

        Ich habe mich gefragt, ob ein Join tatsächlich nötig ist

        die Antwort lautet "Ja".

        und ich das nicht über eine Abfrage lösen kann.

        Die Antwort lautet ebenfalls "Ja".

        Du schreibst:

        SELECT * FROM Tabelle2 WHERE idfirma2 = 'idfirma1'
        ich denke:
        das ist schon mal prima.

        Das ist überhaupt nicht prima.

        Auf meine Inhalte aus Tabelle 2 kann ich ja dann gar nicht zugreifen - ich benötige die aber.

        Ja, wissen wir. Deshalb benötigst Du einen Join.

        Wie steht es mit join, macht das meine Abfragen langsamer?!

        Nein, der JOIN ist das sinnvolle Werkzeug, um Dein Problem zu lösen.
        Warum liest Du nicht die Artikel zur JOIN-Thematik?

        MySQL bietet übrigens mit EXPLAIN ein gutes Werkzeug, um Deine Abfragen zu optimieren. Sinnvolle Indexe sollten es bereits tun.

        Freundliche Grüße

        Vinzenz