2012-11-08 74 views
1

我正在使用PDO。所以我有一个声明准备一个查询来选择一堆记录。例如:PHP循环记录非常慢

//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 

我需要为每个重复数据返回:

+0

你在执行第二个查询? –

+0

你在查询的表格上是否有适当的索引? –

+0

是的,我确实使用索引,我更新了第二个查询 – Giorgi

回答

6

加入将无法正常工作? HIGHLY令人高度怀疑:

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) 
) 
+0

查看更新的查询 – Giorgi

+0

@Giorgi否...您仍然需要使用连接... – Neal

+0

我试过这个,它可以工作,但它不会为这两个记录返回记录,它只返回1条记录,当我需要两条记录时意味着两个副本 – Giorgi

0

如果由于某种原因,你不能使用连接,创建一个存储procudure,这将需要一个id作为参数,返回你需要的数据。

您也可以使用Name的字典编码,因为使用整数的操作要快得多。