Frage

Ich Stelle diese Frage im Namen einer kleinen Gruppe von meinen Usern, die dieses problem haben.

Sobald das Skript Sie verwenden wird, um die 21st-ID, generiert die folgende Fehlermeldung:

WÄHLEN Sie die untersuchen sollte mehr als MAX_JOIN_SIZE rows;überprüfen Sie Ihren WO und mit SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT okay

Ich habe recherchiert, das so viel wie möglich und fand so etwas wie eine Antwort : http://dev.mysql.com/doc/refman/5.0/en/set-option.html

Das problem ist, dass Sie auf shared-hosting, so dass Sie nicht ändern können Ihre MySQL-Einstellungen, um den Fehler zu beheben.

Ist es etwas, das ich schreiben in meinem Skript, so dass Sie dieses problem nicht haben?

Dies ist die Funktion, generiert die Datenbank Abfrage basiert auf, welche Module geladen sind:$sql = 'SELECT ein.id als id ein.Adresse-als Adresse';

        $query  = 'SELECT'
                . ' name AS module_name'
                . ', databasename AS module_database'
                . ', pregmatch AS module_pregmatch'
                . ', pregmatch2 AS module_pregmatch2'
                . ', html AS module_html'
                . ', sqlselect AS database_sqlselect'
                . ', sqljoin AS database_sqljoin'
                . ', sqlupdatewithvalue AS database_sqlupdatewithvalue'
                . ', sqlupdatenovalue AS database_sqlupdatenovalue'
                . ' FROM #__aqsgmeta_modules'
                . ' WHERE enabled = 1'
                . ' ORDER BY id';                       
        $db->setQuery($query);
        $results = $db->loadObjectList();
        if (count($results) != 0) {
            foreach ($results as $result) {
                $sqlselect .= ', ';
                $sqlselect .= $result->database_sqlselect;

                $sqljoin .= ' ';
                $result->database_sqljoin = preg_replace('/\{DATABASENAME\}/Ui', $result->module_database, $result->database_sqljoin);
                if (!(preg_match("/" . $result->database_sqljoin . "/Ui", $sqljoin))) 
                    $sqljoin .= $result->database_sqljoin;
            }
        }

        if ($use_sh404sef)
            $sqlselect .= ', g.oldurl AS sefurl';
        $sql .= $sqlselect;
        $sql .= ' FROM #__aqsgmeta_address AS a';
        $sql .= $sqljoin;

        if ($use_sh404sef)
            $sql .= ' LEFT JOIN #__redirection AS g ON g.newurl = a.address';

        $sql .=
        //. ' WHERE a.id IN (' . $cids . ')'
        ' WHERE a.id = ' . $id
        . ' ORDER BY a.address asc,a.id '
        ;
        $db->setQuery($sql);
        $rows = $db->loadObjectList();
War es hilfreich?

Lösung

MAX_JOIN_SIZE ist eine Fangvorrichtung, die allgemein verwendet auf dem shared hostings.

Es wird nicht lassen Sie versehentlich lange Abfragen, die hängen würde den server.

Geben Sie diesen Befehl ein:

SET SQL_BIG_SELECTS = 1

vor dem ausführen der Abfrage, die Sie kennen, zurück, die viele Werte.

Andere Tipps

Die MAX_JOIN_SIZE getroffen wird, wenn MySQL berechnet die kartesischen Produkt einer Verknüpfung, nicht die tatsächlich erwartete Datensätze zurück.Deshalb, wenn Sie den Beitritt zu einem massiven Tisch, um einen weiteren massiven Tisch, wird dies zu kriechen.Verwenden Sie Indizes und sichten, zu schneiden unten die möglichen Tisch trifft, wenn es wirklich groß ist.

Weitere Informationen finden Sie hier: MySQL - SQL_BIG_SELECTS

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top