我目前有一个名为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。
答案 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。然后将这些值中的每一个相加在一起,以得到有人值的列数。令人高兴的是,您只在循环中运行一个查询,而不是每个列名运行一个查询。