相关子查询在phpMyAdmin中工作,但在PHP脚本中超时

时间:2014-04-08 09:05:07

标签: php mysql phpmyadmin

我有一个查询,我认为这是一种相关的子查询。如果我从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

?>

为什么直接从脚本运行时超时? (作为一个侧面点,是否可以通过某种方式使用连接来提高查询效率?)

3 个答案:

答案 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