0

假设我有七个表,我想对所有表执行相同的查询,然后返回结果。现在我有一些这样的代码

$dates = array();
foreach ($tables as $table) {
  $result = runStatement("
    SELECT MIN(StartDate) as Start, 
           MAX(EndDate) as End 
           FROM $table WHERE ProjectID = ?",
    array($id));
  $stageDates[$table] = $result[0];
}
echo json_encode($dates);

它可以工作,但速度非常慢,因为它必须从七个不同的查询中启动和检索结果。有没有办法将所有查询合并为一个?有没有其他方法可以加快速度?

4

3 回答 3

1

使用带有子查询的连接将解决问题

SELECT
  MIN(t1.StartDate) as Start,
  MAX(t1.EndDate) as End,
  t2.Start,
  t2.END,
  t3.Start,
  t3.END  
FROM table1 as t1
  left join (SELECT
           MIN(t2.StartDate) as Start,
           MAX(t2.EndDate) as End
         FROM table1) as t2
    on t1.id = t2.id
  left join (SELECT
           MIN(t3.StartDate) as Start,
           MAX(t3.EndDate) as End
         FROM table1) as t3
    on t1.id = t3.id  
    -- and so on --  
WHERE t1.ProjectID = 1
于 2012-07-04T08:07:38.437 回答
0

永远不要在循环放置查询。这是最糟糕的事情之一。

我不认为你会得到更快的方式,但是,正如 Dagon 所说,联合将是更清洁和更安全的方式。

SELECT MIN(StartDate) as Start, MAX(EndDate) as End FROM $table1, $table2, $table3 WHERE ProjectID = ?",
于 2012-07-04T07:54:07.160 回答
0

如果您有七个带有“StartDate”、“EndDate”和“ProjectID”的表,则可以使用物化视图(http://www.mysqlperformanceblog.com/2011/03/23/using-flexviews-part-one-introduction- to-materialized-views/ ) 或使用 Solr 或 Sphinx 索引数据。然后查询会快得多,但缺点是您的数据可能会过时。如果几秒钟或几分钟没有问题,请查看这些解决方案。

于 2012-07-04T08:09:57.537 回答