2015-12-10 6 views
1

У меня есть два сотрудника таблицы и посещаемость.Несколько операторов sql или циклов и условий

сотрудник: EmpId, EmpName

посещаемость: attendanceID, EmpId, дата, Интайм, outTime

Мне нужно, чтобы показать эти данные в виде таблицы, где имя сотрудника в левой части, а затем даты. Поэтому заголовки столбцов будут похожи на Emp Name, 1,2,3,4 ...., 30, с или без данных, количество дней в месяце должно быть напечатано.

Я понял три способа сделать это.

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

  2. Цикл через сотрудников, затем цикл в течение нескольких дней в месяце, в каждой записи поступают из базы данных для конкретного сотрудника и конкретные даты.

foreach($employees as $emp) 
{ 
    $empID = $emp['empID']; 
    for($day =1; $day<=$maxDaysInTheMonth $day++) 
    { 
     $attendance = getAttendanceFromDatabase($empID,$day); 
    } 
} 

Чтобы сделать работу лучше, мы стараемся свести к минимуму соединения с базой данных и ненужных петель. Мне нравится реализовать второй способ, поскольку он имеет минимальные условия, а циклы и код чисты. Но он делает поиск базы данных для каждого сотрудника каждый день. Может кто-нибудь указать на некоторые факты для производительности, пожалуйста.

+1

Да. Меньше очередей, как правило, лучше. В этом случае 1 запрос кажется достаточным – Strawberry

ответ

3

Извлечение записей в одном запросе и зацикливание через него лучше. Поскольку он должен вызывать сервер базы данных один раз. Для второго пути - он должен вызывать сервер базы данных несколько раз, что более дорого.

Затем сделайте ассоциативный array по данным. Индекс будет empID.

После создания array вы можете использовать его как хотите.

1

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

$sql="SELECT employee.empName AS empName, attendance.date AS date FROM employee,attendance WHERE employee.empID=attendance.empID"; 
0

Как @Sougata предполагают, выборку записей в одном запросе и перекручивание через него лучше. Но имейте в виде, производительность запроса должна быть увеличена следующим образом:

Избегайте несколько объединений в одном запросе Try, чтобы избежать написания запроса SQL с использованием нескольких объединениями, который включает внешние соединения, применять крест, внешний применяются и другие сложные подзапросы. Это уменьшает выбор Оптимизатора для выбора порядка соединения и типа соединения. Когда-нибудь, оптимизатор вынужден использовать вложенный цикл соединения, независимо от последствий выполнения запросов с чрезмерно сложным крестом применять или подзапросы

Избегайте использование некоррелированного скалярного Sub Query Вы можете перезаписать ваш запрос удалите некоррелированный скалярный запрос в виде отдельного запроса вместо части основного запроса и сохраните вывод в переменной, на которую можно ссылаться в основном запросе или более поздней части пакета.Это даст лучшие варианты Оптимизатору, что может помочь вернуть точные оценки мощности вместе с лучшим планом.

Создание и использование индексов Мы осведомлены о том, что индекс может магическим образом сократить время извлечения данных, но имеет обратный эффект на операции DML, которые могут ухудшить производительность запросов. С этим фактом индексирование является сложной задачей, но может помочь улучшить производительность SQL-запросов и дать вам лучшее время ответа на запрос.

Создание высокой избирательности Index СЕЛЕКТИВНОСТИ определяет процент квалификационных строк в таблице (квалификационное количество строк/общее число строк). Если отношение квалификационного числа строк к общему числу строк невелико, индекс очень селективен и наиболее полезен. Некластеризованный индекс наиболее полезен, если отношение составляет около 5% или меньше, что означает, что индекс может исключить из рассмотрения 95% строк. Если индекс возвращает более 5% строк в таблице, он, вероятно, не будет использоваться; либо будет выбран или создан другой индекс, либо таблица будет проверена.

Позиция столбца в индексе Порядок или позиция столбца в индексе также играет жизненно важную роль для повышения производительности SQL-запросов. Индекс может помочь улучшить производительность SQL-запросов, если критерии запроса совпадают с столбцами, которые больше всего оставлены в ключе индекса. В качестве наилучшей практики большинство выборочных столбцов должны располагаться слева в ключе некластеризованного индекса.