Php MySQL错误1104-SELECT将检查超过MAX_JOIN_大小的行;

Php MySQL错误1104-SELECT将检查超过MAX_JOIN_大小的行;,php,mysql,sql,phpmyadmin,Php,Mysql,Sql,Phpmyadmin,我有一个捐赠者数据库和一个小型非营利组织的门票销售信息。我正在尝试获取一个基于捐款、购买季票或购买单张票的人的快速邮件列表导出。实体表是联系人信息等,其他表则保存有关捐赠年份、金额、支票日期等的信息,并有一个entityno字段,该字段与entity.recordno的主键匹配 以下是我正在运行的查询: SELECT * FROM entity LEFT JOIN individual_donation ON entity.recordno = individual_donati

我有一个捐赠者数据库和一个小型非营利组织的门票销售信息。我正在尝试获取一个基于捐款、购买季票或购买单张票的人的快速邮件列表导出。实体表是联系人信息等,其他表则保存有关捐赠年份、金额、支票日期等的信息,并有一个entityno字段,该字段与entity.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
每个表最多只有300-400行,所以我很惊讶我得到了一个MAX_JOIN_SIZE错误。我也很奇怪,sql查询可以正常工作,但不能用于导出

我相信我可以做得更好的连接等,但我不明白为什么查询运行良好,只是无法导出

编辑: 下面是解释扩展结果

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用户使用文件权限,所以我不能使用导出到。我尝试使用ssh访问,将查询运行到>到一个文件中,得到了MAX\u JOIN\u SIZE错误。我仍然不明白为什么它可以在浏览器的phpmyadmin查询中正常工作,但不能在phpmyadmin中导出,也不能在命令行中工作。

更好地使用索引似乎解决了我的问题,尽管仍然不确定为什么

我确保将三个引用表中的entityno列(对entity表中主键的引用)设置为索引。这似乎解决了在我的查询的某个中间步骤中导致大量返回行的问题。以下是解释扩展结果供参考:

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

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

mysql_query("SET SQL_BIG_SELECTS=1");
您可以尝试:

$query = "SELECT ... ";

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

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

选择@@max\u join\u size的输出是什么?默认值是4294967295。输出是1000000000。十亿?这仍然很高。即使是这几百行中的一行偶然事件也不可能达到这个数字。您能对查询进行扩展解释并将其编辑到您的问题中吗?在上面添加了扩展解释结果以及一些注释。是的,这样就可以了。当查询计划器无法在所需列上找到任何索引时,很可能会假设最坏的情况。在entityno和recordno上添加索引应该可以做到这一点。当查询规划器愚蠢时,运行分析表也是明智的。@Charles ANALYZE TABLE完全修复了我的连接,它无缘无故地崩溃了。谢谢。
$query = "SELECT ... ";

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

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