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