我使用相同的参数进行多次计数。我想知道是否有办法只做一个请求(更有效率)? 我的COUNT如下:
// Get number of MEMBERS in roster of this roster manager
$stmt = $mysqli->prepare("SELECT DISTINCT COUNT(rm.id_membre)
FROM roster_par_membre rm
JOIN roster_par_membre rm2
WHERE rm.id_roster = rm2.id_roster
AND rm2.level = 1
AND rm2.id_membre = ?");
$stmt->bind_param('i', $id_manager);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($nombre_total_membre);
$stmt->fetch();
// Get number of Alerts for this roster manager
$stmt = $mysqli->prepare("SELECT COUNT(id_alerte)
FROM alerte
WHERE modified_by = ?");
$stmt->bind_param('i', $id_manager);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($nombre_total_alerts);
$stmt->fetch();
// Get number of Rosters for this roster manager
$stmt = $mysqli->prepare("SELECT COUNT(id_roster)
FROM roster_par_membre
WHERE id_membre = ?
AND level = 1");
$stmt->bind_param('i', $id_manager);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($nombre_total_rosters);
$stmt->fetch();
答案 0 :(得分:1)
如果您不想将3个查询分开,可以创建一个单独的表来处理这些统计信息:
CREATE TABLE `statistics` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`members_in_roster` int(11) DEFAULT '0',
`number_of_alerts` int(11) DEFAULT '0',
`number_of_roster_per_manager` int(11) DEFAULT '0',
`id_membre` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
您可以将这些号码与id_membre
。
此外,您可以使用MySQL触发器自动更新这些数字,以避免执行3次查询。您必须使用一个查询来获得所需的所有结果。
例如,每次更新警报表时都可以使用以下触发器:
DELIMITER $$
CREATE TRIGGER before_alerts_update
BEFORE UPDATE ON alerts
FOR EACH ROW BEGIN
UPDATE statistics
SET number_of_alerts = IFNULL(number_of_alerts, 0) + 1
WHERE modified_by = NEW.id_membre;
END$$
DELIMITER ;
如果你想用PHP继续计算,而不是使用MySQL触发器,那就不错了。请记住,使用多个触发器可能会降低数据库的性能。例如,在上面提到的例子中,每次"警告"表已更新,触发了UPDATE查询。如果您不需要实时获取这些统计数据,那么此解决方案就是一种过度杀伤性的问题。如果您在用户请求这些号码后进行查询,情况会更好。