Ankündigung

Einklappen
Keine Ankündigung bisher.

Hunderte Select Abfragen zusammenfassen

Einklappen

Neue Werbung 2019

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

  • Hunderte Select Abfragen zusammenfassen

    Mein php Code sieht bisher so aus:

    PHP-Code:
    <?php
    $ANZGES 
    count($arr_words);
    for (
    $i 0$i $ANZGES$i++) {
            
    $sqlString "SELECT id from $table_keywords where keyword='".$arr_words[$i]."' limit 1";
            
    $Ergebnis mysql_db_query($Quelle_update$sqlString$Server_update);
            if (!
    $Ergebnis) {
                    echo 
    "
    Datenbankfehler: 
    $sqlString";
            }
            else {
                    
    $anzahl mysql_num_rows($Ergebnis);
                    if (
    $anzahl) {
                            
    $keywordid[] = mysql_result($Ergebnis0'id');
                    }
            }
            
            
    //keyword noch nicht in der keywordtabelle eingetragen
            
    if(!isset($keywordid)) {
                    
    $sqlString "INSERT INTO $table_keywords (keyword)
                    VALUES ('"
    .$arr_words[$i]."') ";
                    
    $Ergebnis mysql_db_query($Quelle_update$sqlString$Server_update);
                    if (!
    $Ergebnis) {
                            echo 
    "
    Datenbankfehler: 
    $sqlString";
                    }
                    else {
                            echo 
    $arr_words[$i]." eingetragen
    "
    ;
                    }
                    
                    
    $sqlString "SELECT id from $table_keywords where keyword='".$arr_words[$i]."' limit 1";
                    
    $Ergebnis mysql_db_query($Quelle_update$sqlString$Server_update);
                    if (!
    $Ergebnis) {
                            echo 
    "
    Datenbankfehler: 
    $sqlString";
                            
    //return "Datenbankfehler: $sqlString";
                    
    }
                    else {    
    // Daten auslesen
                            
    $anzahl mysql_num_rows($Ergebnis);
                            if (
    $anzahl) {
                                    
    $keywordid[] = mysql_result($Ergebnis0'id');
                            }
                    }
            }
    }
    ?>
    Ich habe eine Tabelle mit Keywords. Nun habe ich eine Liste von Wörtern, die in meiner Suchmaschine "Indexiert" werden sollen.
    Dazu benötige ich die "Keywordid" des Keywords in der Keyword-Tabelle. Dies mache ich nun mit vielen Select-Abfragen. Irgendwie ist es doch
    bestimmt möglich alle diese Select-Abfragen in eine Abfrage zusammenzufassen. Das Problem ist nur, wenn ein Keyword nicht in der
    Keywordtabelle enthalten ist, muss es erst per Insert reingeschrieben werden, um dann anschliesend eine Select abfrage zu machen um die
    keywordid heraus zu bekommen.
    Weiss leider nicht wie ich die Abfragen zusammenfassen soll, da es schon
    mal 500.000 Abfragen bei einem Durchgang werden können

  • #2
    Hmmm. Da fallen mir Speziallösungen zur Volltextsuche ein, egal.

    Zunächst ist dein Zauberwort JOIN, um mehrere Selects zusammenzufassen. Das ganze ist aber nicht i8n Kürze erklärt, daher würde ich raten ein entsprechendes SQL-Tutorial gezielt zum Thema "JOIN" zu durchforsten.

    Ansonsten kannst du nach einem insert (ich gehe von aus, dass die id auto_increment ist) mittels eines Befehls die eingefügte ID rauskriegen: http://www.php.net/mysql_insert_id

    Kommentar


    • #3
      ok danke schon mal für die antwort.

      Volltextsuche ist bei Datenmengen von ca. 10GB aufwärts schon etwas Problematisch und Keyworddichten sowie Rankingfaktoren lassen sich damit leider auch nicht berechnen.

      Werde mich dann wohl mal etwas JOINs befassen.

      Kommentar


      • #4
        Zitat von bratwurstschorsch
        ok danke schon mal für die antwort.

        Volltextsuche ist bei Datenmengen von ca. 10GB aufwärts schon etwas Problematisch und Keyworddichten sowie Rankingfaktoren lassen sich damit leider auch nicht berechnen.

        Werde mich dann wohl mal etwas JOINs befassen.
        *hust* 10GB Texte. Wer schreibt denn sowas?

        Ansonsten ist ein JOIN hier wohl nicht wirklich gut, zumindest für deinen konkreten Fal (Schande über mich, hab jetzt erst in dein Script reingeguckt)l. Wie groß sind deine Keyword-tabellen aktuell?

        Auf alle Fälle kannst schonmal auf mysql_insert_id umstellen. Dann entfällt schonmal die Hälfte der Selects im Insert-Fall grundsätzlich.

        Kommentar


        • #5
          Also die Keywordtabelle hat momentan 195.286 Datensätze und 8,3 MB Größe. Die Tabelle ist so aufgebaut: id(PRIMARY, auto_increment) | keyword (INDEX)


          *hust* 10GB Texte. Wer schreibt denn sowas? Smile
          Momentan sind es ca. 600.000 Produkte und insgesammt 1GB. Soll aber noch 10mal so viel werden

          Kommentar


          • #6
            das sollte schon mit 2 queries zu erledigen sein. soweit ich das sehe, willst du nach der for-schleife nur die ID des keywords wissen.
            also:
            setz 'keyword' in der Keywordtabelle auf UNIQUE ... und dann
            PHP-Code:
            $words = array('foo','bar','baz');
            $insertValues = array();
            foreach( 
            $words as $word ) {
               
            $insertValues[] = sprintf("('%s')",$word);


            $insertQuery "INSERT IGNORE INTO keywordTable (keyword) VALUES ";
            $insertQuery .= implode(", "$insertValues);
            mysql_query($insertQuery);  // fügt jedes 'neue' keyword in die tabelle und ignoriert bereits existierende.

            $selectValues array_map('_quoteSmart',$insertValues);

            $selectQuery "SELECT id, keyword FROM keywordTable 
                 WHERE keyword IN ("
            .implode(', '$selectValues).")";

            $qry mysql_query($selectQuery); // holt alle betroffenen keywords mit der passenden ID aus der datenbank.


            while(list($keywordID$keyword) = mysql_fetch_row($qry)) {
              
            // hier dann ein hash aus keyword => id erzeugen und weiterverarbeiten.
            }

            // hilfsfunktion für array_map
            function _quoteSmart($word) {
               return 
            sprintf("'%s'",$word);

            ... wie's mit der weiteren verarbeitung aussieht, weiß ich nicht - für den suchindex wirst du aber wahrscheinlich nicht einmal
            die zweite abfrage brauchen, sondern nur ein UPDATE über mehrere tabellen machen müssen.

            Kommentar

            Lädt...
            X