2014-01-19 5 views
0

Прошу прощения за титульный вопрос, я не очень понимаю, что я хочу сделать, но я не знал, как объяснить, пожалуйста, прочтите это для дальнейшего объяснения:Как сравнить две разные таблицы SQL и получить разные значения?

У меня есть две таблицы, одна это «сотрудники», в которых есть employeeName и employeesInTime (время, когда они должны работать).

Тогда у меня есть вторая таблица, где сотрудники регистрируют время, которое они получили на работе, у нее есть строки employeeName, timeIn и timeOut.

Что мне нужно сделать, это реализовать систему, в которой я могу видеть все «часы» каждого сотрудника и рассказывать, были ли они вовремя, поздно или вообще не работали.

Заключительный отчет должен выглядеть примерно так:

Employees Name // In // Out // Month - Jan 

           1/2/3/4/5/6/...... 
john smith  8:00 17:00 P P P L M P ....... 

(P для времени, L для поздней и M для отсутствующих). Он также должен указать, в какое время они вошли, когда вы наводите курсор на письмо.

До сих пор я получил таблицу со всеми сотрудниками и время, в которое они должны были попасть и выходить.

Для другой части (ежемесячный отчет) я полностью застрял.

Я получил это:

$query2 = "select * from info where `inout`='in' "; 
$result2 = mysql_query($query2); 

if($result2 === FALSE) { 
die(mysql_error()); // valid only on development stage for debugging 
} 

while($row = mysql_fetch_array($result2)) 
{ 
$timeIn = "".$row['timestamp'].""; 
$name = "".$row['fullname'].""; 
$timeIn = $timeIn + @$tzo; 
echo '<strong>'.$name . '</strong>: ' . date($timefmt, $timeIn) .'<br />'; 
} 

mysql_free_result($result2); 

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

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

Если это уже ответили на предыдущий вопрос, пожалуйста, коснитесь его, и мне очень жаль, что я искал его и искал здесь, в stackoverflow, но не нашел ничего подобного.

Спасибо за ваше время.

редактировать: здесь SQLFiddle

+0

sqlfiddle.com ваши данные пожалуйста. –

+0

Как [это] (http://sqlfiddle.com/#!2/529f8)? – Ant100

ответ

1

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

Я расскажу о том, что бы я сделал, поэтому у вас тоже есть работа, чтобы выяснить детали :). Сначала нужно создать таблицу из первой таблицы, которая будет иметь один массив для каждого сотрудника:

$employees = array( 
    'emp1' => array('name' => 'emp1', 'in' => 8, 'out' => 16), 
    'emp2' => array(...), 
    ...); 

Затем запросить вторую таблицу для входов и выходов в этом месяце, и сохранить его в предыдущий массив:

foreach($row = mysql_fetch_array($result2)) { 
    $day = ...; // count it from timestamp 
    $timeOfDay = ....; // count it from timestamp 
    $employees[ $row['name'] ]['checks'][$day][ $row['inout'] ] = $timeOfDay; 
} 

Да, это сложный массив массивов.

И, наконец, распечатать отчет:

foreach($row = mysql_fetch_array($result2)) { 
    $day = ...; // count it from timestamp 
    $timeOfDay = ....; // count it from timestamp 
    $employees[ $row['name'] ]['checks'][$day][ $row['inout'] ] = $timeOfDay; 
} 

foreach($employees as $employee) { 
    print $employee['name'] . ':'; 
    // for loop through days, 
    // otherwise missed days would not be shown 
    for($day = 1; $day < $maxDay; $day++) { 
     // it would be nice to check, whether 'in' and 'out' values both exist 
     if (array_key_exists($day, $employee['checks'])) { 
      if ($employee['in'] <= $employee['checks'][$day]['in'] && 
       $employee['out'] <= $employee['checks'][$day]['out']) { 
        print ' P '; 
      } else { 
        print ' L '; 
      } 
     } else { 
      print ' M '; 
     } 
    } 
} 
+0

Вау, это отличный ответ, я прочитаю его еще пару раз и начну работать над этим! Кстати, в начале вы хотели создать ** массив ** из первой таблицы? Или фактически создать новую таблицу в моей БД? – Ant100

+0

Первый, создайте массив из первой таблицы. – tzunghaor

+0

большое вам спасибо! Это сработало. Мне все еще приходится составлять несколько других деталей (заказывать их по времени, то есть смена часов, вечерние смены, полдень). Но по крайней мере сейчас он работает :) спасибо! – Ant100

Смежные вопросы