while循环中的子查询:什么是最快的?

时间:2015-01-22 15:07:29

标签: php

我必须通过计算表中的行数来检查while循环中的参数。现在我这样做,但看起来效率很低

while ($stmt->fetch()) {
            $stmt3 = $mysqli->prepare("SELECT COUNT(DISTINCT id_roster)
            FROM dispo
            WHERE id_member = ?");
            $stmt3->bind_param('i', $id_alerte);  
            $stmt3->execute(); 
            $stmt3->store_result();
            $stmt3->bind_result($number_dispo);
            $stmt3->fetch();
           echo $number_dispo;
      }

任何想法如何让它更快(不在每次循环迭代中重复查询?

3 个答案:

答案 0 :(得分:3)

SELECT 
  id_member, COUNT(DISTINCT dispo.id_roster)
FROM 
  test.dispo
GROUP BY id_member;

对于这些数据:

id_roster;id_member
1;1
1;1
2;1
3;2
4;2
5;2
6;3

生成所有id_member的列表以及每个id_roster的相关非重复计数:

id_member;count
1;2
2;3
3;1

您可以进一步将此查询限制为仅限某些id_member 通过添加

WHERE id_member IN (1,2)
GROUP BY之前的

子句。

答案 1 :(得分:1)

您需要将外部查询$stmt与内部查询$stmt3结合使用。您没有提供外部查询的代码,所以我试图通常演示它:

SELECT ot.*, rc.id_roster_count
FROM other_table ot
LEFT JOIN 
(
    SELECT id_member, COUNT(DISTINCT id_roster) AS id_roster_count
    FROM dispo GROUP BY id_member
)
AS rc ON ot.id_member = rc.id_member
WHERE ot.other_value > 5

有可能进一步优化这一点。这取决于您的其他查询和表结构。

答案 2 :(得分:0)

您可以通过简单地提取单个查询中的所有数据并使用group by格式化数据然后使用循环来执行所需的选项来完成此操作。