我有一个查询,我认为这是一种相关的子查询。如果我从phpMyAdmin作为SQL查询运行它,它会在大约6秒内产生预期的结果。该查询旨在返回所有项目以及处理每个项目所花费的总时间。项目表中大约有800行,活动表中有160,000行。
如果我从PHP脚本运行它,如下所示,它不起作用(它超时)。我的max_execution_time设置为120秒。这来自一个更复杂的脚本,我在其中进行了所有相应的错误检查,因此我将其删除到了这里发布的基本部分。即使在真实脚本中进行错误检查等,我得到的唯一信息是致命错误“超过120秒的最大执行时间”。
<?php
$db = new mysqli('127.0.0.1', 'userName', 'password', 'dbName');
$db->set_charset('utf8');
$query = "
SELECT
projects.name,
(
SELECT SUM(activities.effort) AS totalEffort
FROM activities
WHERE activities.project_ID = projects.project_ID
GROUP BY activities.project_ID
)
AS totalEffort
FROM projects";
$statement = $db->prepare($query);
$statement->execute(); // time-out occurs while this line is executing
?>
为什么直接从脚本运行时超时? (作为一个侧面点,是否可以通过某种方式使用连接来提高查询效率?)
答案 0 :(得分:0)
不知道为什么它会从php中超时,但你可以尝试用它来完成它没有mysqli(常规的mysql连接)它可能会工作。 (虽然如果它与特定于连接的东西,内存,诸如此类,它可能仍然失败)
我相信,您也可以将其更改为加入;像这样的东西:
SELECT projects.project_ID, projects.name, SUM(activities.effort) AS totalEffort
FROM projects
left outer join activities on ( activities.project_ID = projects.project_ID )
GROUP BY projects.project_ID;
答案 1 :(得分:0)
尝试将查询重写为连接:
$query = "
SELECT
projects.name,
SUM(activities.effort) AS totalEffort
FROM
projects LEFT JOIN activities ON (activities.project_ID = projects.project_ID)
GROUP BY
activities.project_ID";
出于兴趣,查询是否可以在MySQL命令行中运行?
答案 2 :(得分:0)
不确定为什么会超时。虽然您的查询可以重写。由于您的条件,您的选择中没有必要使用您的分组。这可能更有效率。
SELECT projects.name, a.totalEffort
FROM projects
JOIN (
SELECT project_id, SUM(effort) as totalEffort
FROM activities
GROUP BY project_id
) a ON projects.project_id = a.project_id