2015-01-20 2 views
0

Я делаю несколько счетчиков с использованием того же параметра. Я хотел бы знать, есть ли способ сделать только один запрос (чтобы быть более эффективным)? Мой COUNT заключаются в следующем:PHP: mutliple SELECT 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

Взгляните на это: http://stackoverflow.com/questions/1775168/multiple-select-statements-in-single-query. Вы также можете комбинировать свои заявления в один и выполнять его за один раз. –

+0

@JayBlanchard спасибо за ваш ответ. Тогда я оставлю это так. Хороший день –

ответ

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 Triggers для автоматического обновления этих чисел, чтобы избежать выполнения 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. Если вам не нужны эти статистические числа в режиме реального времени, это решение является «излишним». Будет лучше, если вы выполните запрос, как только пользователь запросит эти цифры.