我有一个小型非营利组织的捐赠者和门票销售信息的数据库。我正在尝试根据捐赠、购买季票或购买单张票的人快速导出邮件列表。"实体"表是联系信息等,然后其他表包含有关捐赠的信息(年份,金额,检查日期等),并具有"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
这个数据库在BlueHost上,我正在通过PHPmyadmin访问它。奇怪的是,当我在 PHPmyadmin 中预览查询时,查询运行良好 - 它返回 216 行,我可以在 SQL 命令浏览器中查看所有行,并且加载正常。
问题是每次我在查询结果操作下使用 PHPmyadmin 的"导出"命令时,都会收到以下错误:
#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 等,但我不明白为什么查询运行良好,但无法导出。
编辑:这是解释扩展结果
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
更多信息:奇怪 - 我的虚拟主机不允许 mysql 用户的 FILE 权限,所以我无法使用导出到。我尝试使用 ssh 访问,运行查询以>到文件中,但出现MAX_JOIN_SIZE错误。我仍然不明白为什么它可以在浏览器中的 phpmyadmin 查询中正常工作,但不能在 phpmyadmin 中导出,也不能从命令行工作。
更好地处理索引似乎已经解决了我的问题,尽管仍然不确定为什么。
我确保将三个引用表中的"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
尝试在执行主查询之前作为查询运行
mysql_query("SET SQL_BIG_SELECTS=1");
你可以试试:
$query = "SELECT ... ";
mysqli_query($databaseConnection, "SET OPTION SQL_BIG_SELECTS=1");
$results = mysqli_query($databaseConnection, $query);