2016-06-15 1 views
-1

J'ai un formulaire d'importation de feuille d'heures où les utilisateurs soumettent les heures travaillées par jour. Ces données sont envoyées à une table appelée heures.Comment interroger la base de données SQL à partir de php sur lequel l'utilisateur n'a pas envoyé son rapport d'heure pour les 30 derniers jours

Ce tableau contient les colonnes:

utilisateur

, jour, heure, BeginTime, endtime

Je veux envoyer chaque employé un e-mail quand ils n'ont pas envoyé dans leurs heures de travail par journée. Ce que j'ai essayé jusqu'ici: créer un tableau avec les utilisateurs actifs.

J'ai créé un tableau à partir d'une requête sql en php avec toutes les feuilles d'heures par utilisateur d'hier.

Avec array_diff_assoc j'ai les utilisateurs qui n'ont pas envoyé leur feuille de temps pour 'hier'.

Donc pas de problème ici. Mais je cherche une solution plus propre qui peut le faire pendant plusieurs jours dans le passé. Disons le dernier mois. Est-ce que quelqu'un a une bonne suggestion pour me pousser dans la bonne direction?

Base de données est sql Langage de programmation php

Ne vous méprenez pas, je ne ai pas besoin de tonnes de code. Je ne suis pas fainéant, je veux essayer de le chercher moi-même. J'ai juste besoin d'une poussée dans la bonne direction.

exemple de la vie réelle:

Tableau structure: Hourimport Table < ---- un à plusieurs < ---- table utilisateur | un à plusieurs | Hourimport détail

Hourimport contient le dayreports numéro d'enregistrement unique, l'utilisateur, la date, le statut, le courrier

Hourimport détail contient les détails des enregistrements du dayreport. Plusieurs enregistrements de détail par jour. Par exemple, une heure de voyage de 8h à 9h et les heures de travail de 9h à 17h. Pauses et miles parcourus. * n'est pas nécessaire pour cet exemple car toutes les données dont j'ai besoin se trouvent dans la table hourimport.

utilisateurs contient id, nom, courrier, etc

echo '<br>STEP 1: <br>Connected successfully <br><br>'; 
$yesterdayT = date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); 
$yesterday = date("Y-m-d H:i:s", strtotime($gisterenT)); 
$yesterday = "'$gisteren'"; 


////////////////////////////////////////////////////////// 
$result = mysql_query("select id as employee from users inner join user_group on users.id=user_group.user_id where group_id=10 or group_id=11"); 
if (!$result) { 
    echo 'Could not run query: ' . mysql_error(); 
    exit; 
} 

$rows = array(); 
while($rows[]=mysql_fetch_array($result)); 

echo "<br>A <--<pre>"; 
print_r ($rows); 
echo "</pre><br><br>"; 
////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////// 
$result1 = mysql_query("select employee from hourimport INNER JOIN hourimport_detail ON hourimport.id=hourimport_detail.parent_id WHERE hourimport.date =$yesterday"); 
if (!$result1) { 
    echo 'Could not run query: ' . mysql_error(); 
    exit; 
} 

$rows1 = array(); 
while($rows1[]=mysql_fetch_array($result1)); 

echo "<br>B <--<pre>"; 
print_r ($rows1); 
echo "</pre><br><br>"; 
////////////////////////////////////////////////////////// 

$result3=array_diff_assoc($rows,$rows1); 
echo "<br>Users that didnt send in their dayreport<pre>"; 
print_r ($result3); 
echo "</pre><br><br>" 

C'est ce que j'ai jusqu'à présent. Et cela fonctionne jusqu'à maintenant.

Hourimport id int (11) auto_increment Date datetime employé int (11) courrier int (11) texte d'état

+2

Veuillez poster un code essayé et quelques données pour un exemple reproductible. La description de votre question est géniale mais nécessite une illustration réelle. – Parfait

+0

Avez-vous aussi une table 'users'? Si oui, veuillez l'ajouter à la question. De plus, quelle base de données utilisez-vous spécifiquement? Toutes les bases de données relationnelles utilisent SQL - MySQL? Serveur SQL? – halfer

+0

Pouvez-vous afficher votre syntaxe create table pour votre table 'hours'? J'ai besoin de connaître le 'type' de vos colonnes. – Gravy

Répondre

-2

Tout d'abord, vous avez besoin d'une table de tous les utilisateurs qui ont soumis leurs heures. Ensuite, vous avez besoin d'une table de tous les utilisateurs.

Ce que vous feriez alors, c'est de faire RIGHT OUTER JOIN sur les deux tables. Le jeu de résultats vous donnerait les utilisateurs qui n'ont pas soumis leurs heures mappées à des valeurs nulles.

-1

En supposant que vous avez une table users avec une clé primaire colonne id ou quelque chose (et la colonne user est un numéro faisant référence users.id), et le format day est quelque chose qui peut être facilement comparé (par exemple date), vous pouvez faire quelque chose comme ceci:

SELECT * FROM users WHERE id NOT IN (SELECT DISTINCT(user) FROM hours WHERE day > :limit) 

:limit est alors un espace réservé pour le jour minimum pour filtrer contre (je suis un gars Java et c'est la syntaxe pour JPA, pour PHP Je pense qu'il est $1 mais vous allez le découvrir ^^)

+0

Je vais jeter un coup d'oeil dans cela. Merci, je vous ferai connaître le résultat. –