PHP:多个SELECT COUNT

时间:2015-01-20 13:21:52

标签: php mysql sql

我使用相同的参数进行多次计数。我想知道是否有办法只做一个请求(更有效率)? 我的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(); 

1 个答案:

答案 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查询。如果您不需要实时获取这些统计数据,那么此解决方案就是一种过度杀伤性的问题。如果您在用户请求这些号码后进行查询,情况会更好。