MySQL错误#1104 - SELECT将检查多于MAX_JOIN_SIZE行;

时间:2013-11-16 19:36:18

标签: php mysql sql phpmyadmin

我有一个小型非营利组织的捐赠者和门票销售信息数据库。我正在尝试根据捐赠,购买季票或购买单张票的人来快速发送邮件列表。 “实体”表是联系信息等,然后其他表保存有关捐赠的信息(年份,金额,检查日期等),并且具有“entityno”的字段,该字段将其与实体的主键匹配.recordno。

这是我正在运行的查询:

SELECT *
FROM
    entity
    LEFT JOIN individual_donation ON entity.recordno = individual_donation.entityno
    LEFT JOIN season_tickets ON entity.recordno = season_tickets.entityno
    LEFT JOIN single_tickets ON entity.recordno = single_tickets.entityno
WHERE 
entity.ind_org = 'ind' AND
entity.address1 <> "" AND
(individual_donation.year <> 'NULL'
OR season_tickets.year <> 'NULL'
OR single_tickets.year <> 'NULL')
GROUP BY entity.lastname
ORDER BY entity.lastname ASC

此数据库位于BlueHost上,我通过PHPmyadmin访问它。奇怪的是,当我在PHPmyadmin中预览时,查询运行得很好 - 它返回216行,我可以查看SQL命令浏览器中的所有行,它加载得很好。

问题是每次我在查询结果操作下使用PHPmyadmin的“export”命令时,都会出现以下错误:

#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay

每个表最多只有300-400行,所以我很惊讶我收到了MAX_JOIN_SIZE错误。对我来说,sql查询工作正常,但在导出时不起作用,这也很奇怪吗?

我确信我可以做更好的JOIN等,但我不明白为什么查询运行正常,但只是不会导出。

编辑: 这是EXPLAIN EXTENDED结果

id  select_type table               type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE      entity              ALL NULL        NULL    NULL    NULL    429 100.00      Using where; Using temporary; Using filesort
1   SIMPLE      individual_donation     ALL NULL        NULL    NULL    NULL    221 100.00  
1   SIMPLE      season_tickets          ALL NULL        NULL    NULL    NULL    102 100.00  
1   SIMPLE      single_tickets          ALL NULL        NULL    NULL    NULL    217 100.00      Using where

更多信息: 奇怪 - 我的webhost不允许mysql用户拥有FILE权限,所以我不能使用EXPORT INTO。我尝试使用ssh访问,将查询运行到&gt;进入文件,我得到MAX_JOIN_SIZE错误。我仍然不明白为什么它会在浏览器中的phpmyadmin查询中正常工作,但不能在phpmyadmin中导出,也不能在命令行中工作。

3 个答案:

答案 0 :(得分:1)

使用索引做得更好似乎已经解决了我的问题,但仍不确定原因。

我确保将三个引用表中的“entityno”列(即实体表中主键的引用)设置为索引。这似乎解决了在我的查询的某些中间步骤中导致大量返回行的问题。作为参考,现在是解释扩展结果:

id      select_type     table                   type    possible_keys   key             key_len ref                             rows    filtered        Extra
1       SIMPLE          entity                  ALL     NULL            NULL            NULL    NULL                            429     100.00          Using where; Using temporary; Using filesort
1       SIMPLE          individual_donation     ref     entityno        entityno        3       dakotask_ds1.entity.recordno    3       100.00
1       SIMPLE          season_tickets          ref     entityno        entityno        3       dakotask_ds1.entity.recordno    2       100.00
1       SIMPLE          single_tickets          ref     entityno        entityno        3       dakotask_ds1.entity.recordno    1       100.00          Using where

答案 1 :(得分:1)

尝试在执行主查询之前作为查询运行

mysql_query("SET SQL_BIG_SELECTS=1");

答案 2 :(得分:0)

您可以尝试:

$query = "SELECT ... ";

mysqli_query($databaseConnection, "SET OPTION SQL_BIG_SELECTS=1");

$results = mysqli_query($databaseConnection, $query);