Ваш алгоритм неверен.
Поскольку вы не фильтруете данные таблицы по дате, для каждой даты в диапазоне дат вы выбираете все строки в таблице tblprocesstimekeeping и печатаете результат для всех них (поэтому у вас есть 21 строка для каждой даты).
Я не знаком с php, поэтому я не буду публиковать здесь код, но вот мои предпочтения:
Сначала нужно узнать идентификаторы сотрудников
Вы можете получить их из базы данных с помощью этого запроса:
“select distinct empCompId from FROM tblprocesstimekeeping where companyAccessID = '$companyAccessID'"
и сохранить их как-нибудь (возможно, в массиве)
затем, чтобы выполнить то, что вы хотите, вам нужно будет выполнить два цикла
// first iterate by date
foreach($daterange as $date)
// then, for each date iterate by employee
foreach($employees as $empId){
// check existance on record
If (exists on data base)
Echo ‘good’
else
echo ‘nodata’
Для «проверки наличия в базе данных» вы можете просто изменить свой запрос, чтобы отфильтровать данные таблицы по дате и
$query = $this->db->query("SELECT * FROM tblprocesstimekeeping where companyAccessID = '$companyAccessID' and date='$dateNumber'
");
Но вы должны иметь это в виду:
Вы делаете столько же последовательных вызовов в базу данных, сколько дат в вашем диапазоне дат.
Если это возможно, рассмотрим алгоритм, который делает только один вызов для данных и возвращает все данные от начала до конца вашего диапазона дат (до цикла foreach $ daterange)
И вы просто фильтруете эти данные, чтобы проверить существование определенной даты в коде.
Если количество задействованных записей не так велико (здесь у вас всего 21), производительность с этим решением будет намного, намного лучше