我问代表一小我的用户有这个问题的这个问题。

在他们正在使用的脚本获取到21的ID,它生成以下错误:

  

在SELECT将审查超过   使用max_join_size行;检查你的WHERE   和使用SET SQL_BIG_SELECTS = 1或SET   SQL_MAX_JOIN_SIZE =#如果SELECT是   好

我已经研究这个尽可能和找到答案的东西:的 http://dev.mysql.com/doc/refman/5.0/en/set-option.html

的问题是,它们是在共享主机,使他们不能改变他们的MySQL设置,以修正错误。

有什么我可以写在我的脚本,使他们没有这个问题?

这是基于在其上加载的模块生成数据库查询的功能:     $ SQL = 'SELECT a.id为ID,作为a.address地址';

        $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();
有帮助吗?

解决方案

MAX_JOIN_SIZE是一个安全锁销上的共享hostings常用。

它不会让你意外地运行长查询,这将挂起服务器。

发出此命令:

SET SQL_BIG_SELECTS = 1

运行查询之前,你知道要返回大量的值。

其他提示

在MySQL的计算的加入,而不是实际的预期记录回笛卡尔积的使用max_join_size被击中。因此,如果你要加入一个庞大的表到另一个大规模的表,这将攀升。使用索引和视图,大肆削减可能打表,如果它真的那么大。

请参阅更这里: MySQL的 - SQL_BIG_SELECTS

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top