Ankündigung

Einklappen
Keine Ankündigung bisher.

WHERE Optimierung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • WHERE Optimierung

    Hallo,

    aufgrund eines Datenexportes in XML habe ich diesen Stream aufbereitet der wie folgt aufgebaut ist:

    Code:
    $STREAM[ARTNR][DATEN1]
    $STREAM[ARTNR][DATEN2]
    $STREAM[ARTNR][DATEN3]
    ...
    Nun gehe ich das Array per foreach durch und baue mir ein

    WHERE artnr!=$ARTNR AND artnr!=$ARTNR AND ...

    Gibt es eine Möglichkeit das ganze zu optimieren? Möchte erstmal herausfinden welche Artikelnummern es in der Datenbank noch nicht gibt.
    http://www.donvelopment.org

  • #2
    Es gibt soweit ich weiß
    WHERE artnr IN (1,2,3,..)

    Hast du ein besseres Beispiel, auch wenns nur ein Beispiel ist:
    WHERE artnr!=$ARTNR AND artnr!=$ARTNR AND ...
    macht halt keinen Sinn, da gleiche Werte und deshalb verstehe ich nicht was du aus dem XML "streamst"..

    Abgesehen davon aber sind OR Bedingungen AND Bedingungen meist vorzuziehen, wenn möglich, da bei OR eine wahre Bedingung zum Abbruch des Tests weiterer Bedingungen führt, bei AND aber alle Bedingungen durchgetestet werden müssen.

    Kommentar


    • #3
      Die SQL-Abfrage sollte sich wie folgt darstellen:

      "SELECT zahl FROM tabelle WHERE zahl NOT IN (1,2,3,4,5)";

      Du kannst also in PHP
      eine kommaseparierte Liste generieren zB: $liste = "1,2,3,4,5";

      Und die SQL-Abfrage dann so schreiben:

      "SELECT zahl FROM tabelle WHERE zahl NOT IN ($liste)";

      ~dilemma~

      Kommentar


      • #4
        Zitat von dilemma
        eine kommaseparierte Liste generieren
        .. geht mit implode

        Kommentar


        • #5
          Um es mal deutlicher zu machen

          Ich habe eine XML Datei (artikel.XML) die ich per XML (http://de3.php.net/manual/de/ref.xml.php) auslese und mir folgendes Array baue:

          Code:
          $PRODUCTS => Array
          		{
          			[0010] => Array
          				{
          					[base_product] => Array
          						{
          							[artno] => ...
          							[description] => ...
          							...
          						}
          
          					[sub_products] => Array
          						{
          							[artno] => ...
          							[description] => ...
          							[price] => ...
          							...
          						}
          				}
          
          			[0012] => Array
          				{
          					[base_product] => Array
          						{
          							[artno] => ...
          							[description] => ...
          							...
          						}
          
          					[sub_products] => Array
          						{
          							[artno] => ...
          							[description] => ...
          							[price] => ...
          							...
          						}
          				}
          		}
          Daher will ich erstmal per foreach das Array durchgehen, um herauszufinden welche Artikelnummern es in der Datenbank noch nicht gibt

          Code:
          foreach($PRODUCTS as $ARTNR => $VALUE)
          {
          	$QUERY = (string) "SELECT * FROM products WHERE ";
          	$QUERY.= "products_model='" . $ARTNR . "'";
          }
          Sehe gerade, daß oben mein Ansatz im 1. Posting sowieso falsch ist. Zurück zum Thema. So könnte ich dann den Query jedes mal ausführen und per mysql_num_rows schauen wie das Ergebnis ist. Ist das Produkt vorhanden oder nicht. Daher suchte ich eben noch eine bessere Alternative die vielleicht sogar noch perfomanter ist.

          Hatte zwar die mysql doc durchgeschaut (Kapitel 7) aber das NOT IN nicht geshen. Ich werde es mal darüber probieren.

          Danke erstmal für eure Hilfe.


          EDIT:

          Gerade mitbekommen das NOT IN auch nicht hilfreich ist. Werde es wohl doch in einer Schleife über eine SELECT Abfrage pro Produkt machen müssen.
          http://www.donvelopment.org

          Kommentar


          • #6
            Warum soll NOT IN nicht hilfreich sein? Das ist doch genau die Funktion für solche Fälle:
            PHP-Code:
            foreach($PRODUCTS as $ARTNR => $VALUE)
            {
               
            $numbers[] = $ARTNR ;
            }

            $QUERY "SELECT artnr
                              FROM products 
                              WHERE products_model NOT IN(" 
            implode(', '$numbers) . ")"
            Gruss
            L

            Kommentar


            • #7
              @lazydog:

              Klar, haste recht. Hatte bisher noch nicht meinen morgentlichen Kaffee


              Danke für Eure Hilfe.
              http://www.donvelopment.org

              Kommentar

              Lädt...
              X