有没有一种更快的方法可以从多个表中获取信息


Is there a faster way to get information from multiple tables?

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

$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);

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

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

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
永远不要

查询放在循环中。这是最糟糕的事情之一。

我不认为你会得到更快的方法,但是,正如达贡所说,工会会更清洁、更安全。

SELECT MIN(StartDate) as Start, MAX(EndDate) as End FROM $table1, $table2, $table3 WHERE ProjectID = ?",

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