Markus aus Bremen: 2 Arrays in einer Abfrage über 2 Tabellen mischen?

Hallo,

ich bin neu hier, habe bisher nur gelesen, muss nun aber erstmal selbst eine Frage stellen, weil ich bei der Suche keine Antwort gefunden habe.

Also:
Ich möchte eine Abfrage über zwei verknüpfte Tabellen erstellen (kein Problem soweit mit LEFT JOIN), wobei die Bedingungen für die erste Tabelle aus Array1 stammen und die für die zweite aus Array2.

Im Text formuliert würde das so aussehen:
Gib mir alle Artikel zurück, die in Tabelle1 eine der Bedingungen aus Array1 erfüllen und gleichzeitig aus Tabelle2 eine der Bedingungen aus Array2.

Zur Erklärung:
Artikel werden zwei unterschiedlichen Kategoriebäumen zugeordnet (Ort und Art), dazu gibt es zwei unterschiedliche Tabellen (products_to_categories1 und products_to_categories2), die ich nicht zu einer zusammenfassen möchte. In Array1 sind alle Kategorien1 zusammengfasst, die ich haben möchte (also z.B. Hamburg, Bremen, München), und in Array2 alle Kategorien2 (also z.B. Hotels, Jugendherbergen). Gesucht werden alle Artikel, die sowohl einer Kategorie aus Array1 als auch gleichzeitig einer aus Array2 zugeordnet sind, soll heißen alle Hotels und Jugendherbergen in Hamburg, Bremen und München.

Ich hoffe, ich konnte mich verständlich ausdrücken und danke schon jetzt für Eure Hilfe.

Vielleicht habe ich einfach nur ein Brett vor dem Kopf.

Markus

  1. Hi,

    Ich hoffe, ich konnte mich verständlich ausdrücken

    nein. Du willst ein SQL-Statement erstellen, dessen Aussehen Dir offenbar klar ist. Dies generierst Du mit PHP-Mitteln - welches Problem hast Du bei dem Vorhaben, mittels PHP-Variablen einen String bestimmten Aufbaus zu erzeugen?

    Vielleicht habe ich einfach nur ein Brett vor dem Kopf.

    Das scheint mir so. Es ist übrigens nicht zu empfehlen, dieses mittels Hacker-Werkzeugen zu entfernen; dabei könnten Narben verbleiben ;-)

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah,

      vielen Dank für Deien Antwort. Mein Problem ist tatsächlich die genaue Formulierung der Abfrage.

      SELECT *  
        FROM products_to_categories1      T1  
        LEFT JOIN products_to_categories2 T2 ON T1.foo = T2.bar  
       WHERE T1.Ort IN ('Hamburg', 'Bremen', 'München')  
         AND T2.Art IN ('Hotel', 'Jugendherberge')
      

      Diese Abfrage trifft es eigentlich schon. ich kenne nur den Inhalt des Arrays nicht, weil das durch eine vorhergehende Abfrage gefüllt wird. Kann ich die beiden Arrays direkt in die Abfrage einbinden, oder muss ich es erst auslesen und über eine Hilfsvariable einbinden?

      Der Markus

      Hi,

      »» Ich hoffe, ich konnte mich verständlich ausdrücken

      nein. Du willst ein SQL-Statement erstellen, dessen Aussehen Dir offenbar klar ist. Dies generierst Du mit PHP-Mitteln - welches Problem hast Du bei dem Vorhaben, mittels PHP-Variablen einen String bestimmten Aufbaus zu erzeugen?

      »» Vielleicht habe ich einfach nur ein Brett vor dem Kopf.

      Das scheint mir so. Es ist übrigens nicht zu empfehlen, dieses mittels Hacker-Werkzeugen zu entfernen; dabei könnten Narben verbleiben ;-)

      Cheatah

  2. Mahlzeit Markus aus Bremen,

    was genau hat Deine Frage mit PHP zu tun? Ich habe mal den Themenbereich geändert - Du solltest noch das von Dir verwendete DBMS samt Version angeben.

    Im Text formuliert würde das so aussehen:
    Gib mir alle Artikel zurück, die in Tabelle1 eine der Bedingungen aus Array1 erfüllen und gleichzeitig aus Tabelle2 eine der Bedingungen aus Array2.

    Und in SQL würde ich das ungefähr so formulieren:

    SELECT *  
      FROM products_to_categories1      T1  
      LEFT JOIN products_to_categories2 T2 ON T1.foo = T2.bar  
     WHERE T1.Ort IN ('Hamburg', 'Bremen', 'München')  
       AND T2.Art IN ('Hotel', 'Jugendherberge')
    

    Vielleicht habe ich einfach nur ein Brett vor dem Kopf.

    Keine Ahnung, kann ich von hier aus nicht sehen. Klappt es mit einer Abfrage ähnlich der o.g.?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo Ekki,

      zunächst mal vielen Dank für Deine Mühe. Ich glaube, das geht so in die richtige Richtung. Mein Problem ist eher die Formulierung der korrekten Anfrage.

      SELECT *  
        FROM products_to_categories1      T1  
        LEFT JOIN products_to_categories2 T2 ON T1.foo = T2.bar  
       WHERE T1.Ort IN ('Hamburg', 'Bremen', 'München')  
         AND T2.Art IN ('Hotel', 'Jugendherberge')
      

      Mein problem ist, dass ich die Inhalet der beiden Arrays nicht kenne, weil die aus einer vorangegangenen Abfrage gefüllt werden, was ja ebenfalls kein Problem ist. Wenn Du mri sagen kannst, wie ich das korrekt formuliere, ist Dir mein ewiger Dank sicher.

      SELECT *  
        FROM products_to_categories1      T1  
        LEFT JOIN products_to_categories2 T2 ON T1.foo = T2.bar  
       WHERE T1.Ort IN (Array1)  
         AND T2.Art IN (Array2)
      

      Es ist nicht bekannt, wie viele Einträge in den beiden Arrays stecken. Diese Abfrage müsste also möglichen Fälle gegeneinander abklopfen. Kann ich die Arrays direkt in die Abfrage einsetzen oder muss ich zuerst die Werte auslesen und dann die Ergebnisse über eine Hilfsvariable in die Abfrage einsetzen?

      Nochmal Danke.

      Markus

      Mahlzeit Markus aus Bremen,

      was genau hat Deine Frage mit PHP zu tun? Ich habe mal den Themenbereich geändert - Du solltest noch das von Dir verwendete DBMS samt Version angeben.

      »» Im Text formuliert würde das so aussehen:
      »» Gib mir alle Artikel zurück, die in Tabelle1 eine der Bedingungen aus Array1 erfüllen und gleichzeitig aus Tabelle2 eine der Bedingungen aus Array2.

      Und in SQL würde ich das ungefähr so formulieren:

      SELECT *

      FROM products_to_categories1      T1
        LEFT JOIN products_to_categories2 T2 ON T1.foo = T2.bar
      WHERE T1.Ort IN ('Hamburg', 'Bremen', 'München')
         AND T2.Art IN ('Hotel', 'Jugendherberge')

      
      >   
      >   
      > »» Vielleicht habe ich einfach nur ein Brett vor dem Kopf.  
      >   
      > Keine Ahnung, kann ich von hier aus nicht sehen. Klappt es mit einer Abfrage ähnlich der o.g.?  
      >   
      >   
      > MfG,  
      > EKKi  
      > 
      
      1. Hi,

        zitiere bitte vernünftig, und nicht einfach alles!

        SELECT *

        FROM products_to_categories1      T1
          LEFT JOIN products_to_categories2 T2 ON T1.foo = T2.bar
        WHERE T1.Ort IN ('Hamburg', 'Bremen', 'München')
           AND T2.Art IN ('Hotel', 'Jugendherberge')

        
        >   
        > Mein problem ist, dass ich die Inhalet der beiden Arrays nicht kenne, weil die aus einer vorangegangenen Abfrage gefüllt werden, was ja ebenfalls kein Problem ist. Wenn Du mri sagen kannst, wie ich das korrekt formuliere, ist Dir mein ewiger Dank sicher.  
          
        Alles was du brauchst, ist eine Schleife über alle Array-Elemente - um daraus dann einen String in der Form zusammezubauen, wie er in obiger Query einzusetzen ist - also Elementinhalte für den Einsatz in einer MySQL-Query behandeln, in Hochkommata einschliessen, und durch Kommata trennen.  
          
        Das ist ja wohl nicht so schwer, wenn man ein kleines bisschen drüber nachdenkt ... also, leg mal los und zeig deinen Versuch.  
          
        MfG ChrisB  
          
        
        -- 
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        
      2. Mahlzeit Markus aus Bremen,

        Mein problem ist, dass ich die Inhalet der beiden Arrays nicht kenne,

        Wieso nicht?

        weil die aus einer vorangegangenen Abfrage gefüllt werden, was ja ebenfalls kein Problem ist.

        Sind es denn Arrays?

        WHERE T1.Ort IN (Array1)
           AND T2.Art IN (Array2)[/code]

        Es ist nicht bekannt, wie viele Einträge in den beiden Arrays stecken.

        Wieso nicht? Wenn Du die Werte vorher abfragst, sind sie Dir doch bekannt. Du musst die einzelnen Array-Element nur noch in geeigneter Form als String miteinander verketten und in die Abfrage einsetzen.

        Oder willst Du alles mit einer Abfrage erschlagen? Dann solltest Du es evtl. mit geeigneten Unterabfragen versuchen:

        ...  
         WHERE T1.Ort IN (SELECT foo FROM bar WHERE fasel = 'blubb')  
           AND T2.Ort IN (SELECT blubb FROM bla WHERE gross < 1)
        

        Ob Dein DBMS das kann, kannst nur Du sagen. Alternativ nennst Du es uns endlich mal, dann kann man Dir auch gezielter helfen.

        Kann ich die Arrays direkt in die Abfrage einsetzen oder muss ich zuerst die Werte auslesen und dann die Ergebnisse über eine Hilfsvariable in die Abfrage einsetzen?

        Die Frage kannst Du Dir selbst beantworten: beantworte dazu folgende Hilfsfragen: Kann Dein DBMS mit PHP-Code bzw. PHP-Variablen umgehen? Wie wird SQL-Code in PHP üblicherweise notiert - und in was für einer Variable welchen Typs wird er gespeichert?

        Und gewöhne Dir bitte zeitnah TOFU ab!

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Salü,

          wenn ich die beiden Arrays vorher in eine hilfsvariable überführe, die ich in die Abfrage einsetze, ergibt sich z.B. folgendes:

          // Arrays in Hilfsvariablen übeführen  
          $anzahl_array_cat1 = count($array_cat1);  
          for ($i=0; $i<$anzahl_array_cat1; $i++) {  
            $hilfsvar1_1.= '\'' . $array_cat1[$i] . '\',';  
          }  
            
          $anzahl_array_cat2 = count($array_cat2);  
          for ($j=0; $j<$anzahl_array_cat2; $j++) {  
            $hilfsvar2_2.= '\'' . $array_cat2[$j] . '\',';  
          }  
            
          // Das letzte Komma aus String entfernen  
          $hilfsvar1 = substr($hilfsvar1_1, 0, -1);  
          $hilfsvar2 = substr($hilfsvar2_2, 0, -1);  
            
          // Wie viele Treffer?  
          $numrows_query = mysql_query("SELECT COUNT(*) FROM products_to_categories JOIN products_to_categories2 ON (products_to_categories.products_id = products_to_categories2.products_id) WHERE products_to_categories.categories_id IN ($hilfsvar1) && products_to_categories2.categories_id IN ($hilfsvar2)");  
          $numrows = mysql_result($numrows_query, 0);
          

          Eigentlich ist die Lösung ganz einfach. Kann man möglicherweise noch viel eleganter machen, wichtig ist aber nur, dass es so funktioniert.

          Vielen Dank für Eure Hinweise und Mühe.

          Und gewöhne Dir bitte zeitnah TOFU ab!

          Jup.