1

PDOを使用しています。したがって、一連のレコードを選択するためのクエリを準備するステートメントがあります。例:

   //select duplicates
   $stmt = $this->db->prepare('SELECT Name COUNT( * ) AS CNT
            FROM  `Test`
            GROUP BY Name
            HAVING CNT > 1');

   $stmt2 = $this->db->prepare('SELECT * FROM Test2 WHERE TName = ?');

特定の列ではなく、すべてのデータを選択する必要があることに注意してください。テーブルには 5,000 レコード、場合によってはそれ以上のレコードが含まれます。5,000 件のレコードをすべて選択する必要があり、それぞれに対して別のクエリを実行して別のものを選択する必要があります。

   $arr = array();
   while ($row = $stmt->fetch(DB::FETCH_ASSOC)) {
       $stmt2->execute($row['Name']);
       $arr[] = $stmt2->fetchAll(DB::FETCH_ASSOC);
   }

結合を使用できることはわかっていますが、私の場合、データをループして stmt1 行ごとに stmt2 を実行する必要があるため、結合は機能しません。

これを実行すると、許容できない最大 10 ~ 15 分かかります。もっと速くする必要があります。誰が問題が何であるか教えてもらえますか? 5k レコードはループするほど多くないようです。

      STMT1 returns up to 5.5k records

返された複製ごとにデータが必要です。

4

2 に答える 2

6

参加は機能しませんか?非常に非常に疑わしい:

SELECT test2.*, count(test.name) AS cnt
FROM test
LEFT JOIN test2 ON test2.id = test.id
GROUP BY test.name
HAVING (cnt > 1)

OPの問題を考慮して、別の試み:

SELECT *
FROM test2
WHERE name IN (
   SELECT DISTINCT name
   FROM test
   GROUP BY name
   HAVING (count(*) > 1)
)
于 2012-11-08T15:23:45.257 に答える
0

なんらかの理由で JOINS を使用できない場合は、id を引数として取り、必要なデータを返すストアド プロシージャを作成します。

Name整数を使用した操作ははるかに高速であるため、辞書エンコーディングを に使用することもできます。

于 2012-11-08T15:26:18.353 に答える