我必须通过计算表中的行数来检查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;
}
任何想法如何让它更快(不在每次循环迭代中重复查询?
答案 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格式化数据然后使用循环来执行所需的选项来完成此操作。