Как проверить лучших сотрудников года

Это моя таблица MySQL:

_______________________________________________
Id | Name| Employee id | Date       | Attendance
_______________________________________________
1  | xyz |     196     | 2013-04-01 | present  
2  | xyz |     196     | 2013-04-02 | present  
3  | xyz |     196     | 2013-04-03 | present  
4  | xyz |     196     | 2013-04-04 | absent  
5  | xyz |     196     | 2013-04-05 | present  
6  | abc |     197     | 2013-04-01 | present

7  | abc |     197     | 2013-04-02 | present  
8  | abc |     197     | 2013-04-03 | present  
9  | abc |     197     | 2013-04-04 | present  
10 | abc |     197     | 2013-04-05 | present

_______________________________________________

Я хочу посчитать дни, в которых сотрудники в основном присутствуют, и я хочу получить такой результат в PHP:

___________________________________________________________
 Name| Employee id| Attendance     | Best OR NOT
___________________________________________________________
 xyz |  196       | 4 Present days |

 abc |  197       | 5 Present days | This is best employees of the year

__________________________________________________________________________

Как я могу это сделать?

5 ответов

Решение

Попробуй это.

   $query = mysql_query("select name ,`Employee id` as emplyee_id, CONCAT(count(`Employee id`),' Present days') as Attendance
   from Table1 
   where `Attendance` = 'present' group by `Employee id` ");



   while($row = mysql_fetch_array($query)) {
  echo $row['name']. " - " .$row['emplyee_id']. " - " .$row['Attendance']."</ br>";
 }

ДЕМО ЗДЕСЬ

SQL

SELECT name, employeeID count(userID) as datesAttend FROM Attendance GROUP BY name

PHP (метод класса mysql, просто пример)

/* mysql_query example ( use beter db class ) */

$best = 0;
$bestEmployee = '';

$query = mysql_query("SELECT Name, EmployeeID, count(EmployeeID) as datesAttend FROM Attendance GROUP BY EmployeeID");

while($row = mysql_fetch_array($query)) {
  echo $row['Name']. " " .$row['EmployeeID']. " " .$row['datesAttend'];
  if($row['datesAttend'] > $best) {
   $best = $row['datesAttend'];
   $bestEmployee = $row['EmployeeID'];
  }
}

echo $bestEmployee ." is employee of the year!!!";
throw PartyForEmployee();

Пример: http://www.sqlfiddle.com/

Попробуйте этот запрос..

SELECT *, COUNT(employee_id) AS cnt, CASE WHEN employee_id = (SELECT employee_id FROM employees
WHERE 1 GROUP BY  employee_id ORDER BY COUNT(employee_id) DESC LIMIT 0 , 1)   THEN 'Best' 
ELSE 'Not' END AS avl
FROM  `employees`
WHERE 1 
GROUP BY employee_id

Измените имя таблицы и имя поля в соответствии с вашими потребностями

Этот запрос даст вам лучшего сотрудника:

select Name, "Employee id", count(*) 
from table_name 
where Attendance = "present" 
group by Name 
order by count(*) desc 
limit 1;

Предложение group by означает, что вы хотите получить отдельный результат для каждого сотрудника. Предложение "где" гарантирует, что вы не будете считать дни, когда они отсутствовали. Условие "заказ по" ставит на первое место сотрудников с наибольшим количеством дней. Предложение limit ограничивается первым, поскольку вы хотите только лучшее.

Такой запрос:

select employeeId, count(employeid) as num from table_name group by attendence limit 1 

даст вам лучший идентификатор работника. И вы можете редактировать таблицу, вставив ее в нужное место. Также не могли бы вы объяснить свой вопрос немного больше?

//DB_HOST etc. are db connection constants
$dbc=mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$data = mysql_query('your query') or die(mysql_error());
// A COUNT query will always return 1 row
// Use fetch_assoc it's easier to use
$row = mysql_fetch_assoc($data);
$bestId = $row['employeeId'];
$bestDayNumber = $row['num'];
Другие вопросы по тегам