0

これはしばらくの間私を悩ませてきました。初心者として、正確に何を探すべきかわかりません。数時間のグーグル検索の後、満足のいく答えを見つけることができませんでした。

私は比較的複雑なクエリを持っていますが、それを取り除いて単純化して次のようにしました。

SELECT field_a1,
       field_a2,
       (SELECT Count(*)
        FROM   table_b
        WHERE  field_b1 IN (SELECT field_x1
                            FROM   table_x) AND field_b2 = 1) AS new_field_1,
       (SELECT Count(*)
        FROM   table_c
        WHERE  field_c1 IN (SELECT field_x1
                            FROM   table_x) AND field_c2 = 2) AS new_field_2,
       (SELECT Count(*)
        FROM   table_d
        WHERE  field_d1 IN (SELECT field_x1
                            FROM   table_x) AND field_d2 = 3) AS new_field_3
FROM   table_a
WHERE  field_a1 IN (SELECT field_x1
                    FROM   table_x)

元のクエリでは、約 30 個ありnew_field_*ます。すべてがうまく機能しているようで、非常に満足のいく結果 (最終結果とパフォーマンス) が得られています。

私の問題は、このクエリです:

SELECT field_x1
FROM   table_x

はかなりの回数 (30 * 返される行数) 繰り返され、 がWHERE IN一致を検索するセットとして常に使用されます。

私の質問:

この小さなクエリを 1 回だけ実行し、その結果を保持して繰り返し使用することは可能ですか?

私が考えることができた唯一の(ばかげた)ことは、次のようなものでした(想像上の解決策):

temp = (SELECT field_x1
        FROM   table_x)
SELECT field_1
FROM   table_1
WHERE  field_1 IN temp

または、このクエリをクライアント側 (PHP を実行している Web サーバー) で 1 回実行し、次のようなものを使用して結果を将来のクエリに追加します。

$IN_Condition = implode(',', $stmt->execute()->fetchAll(PDO::FETCH_NUM));
$sql_query = "SELECT field_1
              FROM   table_1
              WHERE  field_1 IN ($IN_Condition)"
4

2 に答える 2

1

クエリの最適化を行う必要がない場合もあります。エンジンが同様のサブクエリを見つけた場合、データは 1 回だけフェッチされます。ただし、このクエリを試して、高速かどうかを確認できます。

SELECT a.field_a1, a.field_a2,
   (SELECT Count(*)
    FROM x
    WHERE x.field_x1 = b.field_b1
      AND b.field_b2 = 1) AS new_field_1,
   ...
FROM table_a, table_b b, ..., -- Query here the tables you need
     (SELECT field_x1
      FROM table_x) x
WHERE field_a1 IN x

テーブルをメモリに保持し、データを php エンジンと比較することもできますが、db エンジンで作業するよりも遅くなります。

編集:必要な各テーブルは一度クエリされます

編集 2: ロジックを逆に!

于 2012-07-02T07:48:39.253 に答える
1

JOIN 句を使用してみてください。

編集:

SELECT
  field_a1,
  COUNT(b.field_b1) new_field_1,
  COUNT(c.field_c1) new_field_2,
  COUNT(d.field_d1) new_field_3
FROM
  table_a a
JOIN table_x x
  ON x.field_x1 = a.field_a1
LEFT JOIN table_b b
  ON b.field_b1 = x.field_x1
LEFT JOIN table_c c
  ON c.field_c1 = x.field_x1
LEFT JOIN table_d d
  ON d.field_d1 = x.field_x1
GROUP BY
  a.field_a1
于 2012-07-02T07:49:52.783 に答える