PHP PDO Количество MYSQL столбцов, содержащих значение в одной строке - PullRequest
0 голосов
/ 01 декабря 2018

В настоящее время у меня есть таблица с именем register, содержащая user_id, за которым следует изменяющийся список дат (столбцов) с префиксом date.Пример: date14102018.

Мне нужно подсчитать все столбцы, содержащие 'Attended', принадлежащие пользователю, цикл пользователя обрабатывается оператором while в начале приведенного ниже сценария.

Мне понадобится цикл, чтобы сделать это для каждого определенного пользователем.

Примечание: Это не полный сценарий и НЕ работает.

while ($row2 = $stmt->fetch(PDO::FETCH_ASSOC)) {

        $attendCount = 0;

        foreach ($Date as $item) {
            $value1 = 'Attended';

            $stmt = $db->prepare('SELECT COUNT('.$item.') FROM register WHERE (user_id = :value2 AND '.$item.' = :value)');
            $stmt->execute(array(':value2' => $row['ID'], ':value' => $value1));
            $attendedCount = $stmt->fetchColumn();

            $attendCount = $attendCount + $attendedCount;
        }
        echo '<td style="font-weight:600;">' . $attendCount . '</td>';
        echo '</tr>';
    }

Переменные:

$Date - это массив, содержащий все имена столбцов (даты) из таблицы register.

$row['ID'] взят изтаблица users, содержащая идентификатор, соответствующий user_id в таблице register.

1 Ответ

0 голосов
/ 01 декабря 2018

Здесь две части, первая - скорее предложение: вместо того, чтобы иметь столбец для каждой даты, почему бы не настроить вашу таблицу регистров так, чтобы в ней были только столбец user_id и date.всякий раз, когда вам нужно отследить посещенную дату, вы просто добавляете новую строку в таблицу, чтобы можно было иметь несколько строк с одним и тем же user_id, а затем для подсчета все, что вам нужно сделать, это:

select count(user_id) as attendCount from register where user_id = :value2

Затем вы можете объединить его с таблицей пользователя в своем первом операторе и сделать только один запрос к базе данных для всего процесса.

Вторая часть, предполагая, что вышеприведенное не являетсяодним из вариантов будет цикл по всем столбцам даты и построение оператора sql, а затем один раз запустить его в цикле.что-то вроде этого:

$parts = array();
foreach ($Date as $item) {
        $parts = "if( " . $item . " = 'Attended', 1, 0)";
}

$sql = 'SELECT (' . join(' + ', $parts) . ') as itemCount FROM register WHERE (user_id = :value2)';
$stmt = $db->prepare($sql);
$stmt->execute(array(':value2' => $row['ID']));
...

Этот запрос должен просто проверять каждый столбец на "Attended", если он там использует 1, в противном случае 0. Затем каждое из этих значений складывается, чтобы получить количество столбцов сстоимость посещенных.Приятно то, что вы выполняете только один запрос в цикле вместо одного запроса на имя столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...