PHP PDO计数一行包含值的MYSQL列

时间:2018-12-01 18:13:12

标签: php pdo

我目前有一个名为register的表,其中包含一个user_id,后跟一个变化的日期(列)列表,其前缀为date。例如:date14102018

我需要计算用户拥有的所有包含“参加”的列,该用户循环由以下脚本开头的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对应的ID。

1 个答案:

答案 0 :(得分:0)

这里有两个部分,第一个部分是一个建议:不是在每个日期都有一列,为什么不将您的注册表设置为只包含一个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']));
...

此查询应仅检查“参加”的每一列是否使用1,否则使用0。然后将这些值中的每一个相加在一起,以得到有人值的列数。令人高兴的是,您只在循环中运行一个查询,而不是每个列名运行一个查询。