0

7 つのテーブルがあり、それらすべてに対して同じクエリを実行し、結果を返したいとします。今、私はこのようなコードをいくつか持っています

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

動作しますが、7 つの異なるクエリを開始して結果を取得する必要があるため、非常に遅くなります。すべてのクエリを 1 つにまとめる方法はありますか? それを高速化する他の方法はありますか?

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

ループ内にクエリを入れないでください。それは最悪のことの1つです。

あなたがより速い道を歩むとは思いませんが、ダゴンが言ったように、組合はよりクリーンで安全な方法になるでしょう.

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」を含む 7 つのテーブルがある場合、マテリアライズド ビュー ( http://www.mysqlperformanceblog.com/2011/03/23/using-flexviews-part-one-introduction- to-materialized-views/ ) または Solr または Sphinx を使用してデータのインデックスを作成します。その後、クエリははるかに高速になりますが、データが古くなる可能性があるという欠点があります. 数秒または数分で問題ない場合は、それらの解決策を見てください。

于 2012-07-04T08:09:57.537 に答える