我有一个小型非营利组织的捐赠者和门票销售信息数据库。我正在尝试根据捐赠,购买季票或购买单张票的人来快速发送邮件列表。 “实体”表是联系信息等,然后其他表保存有关捐赠的信息(年份,金额,检查日期等),并且具有“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中导出,也不能在命令行中工作。
答案 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);