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 = ?');

请注意,我确实需要选择所有数据,而不是某些列。该表包含 5k 条记录,有时甚至更多。我需要选择所有 5k 记录,并且对于每个记录,我需要执行另一个查询来选择其他内容。

   $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 回答