2015-03-01 1 views
0

J'ai une base de données contenant des travailleurs et trois tâches différentes qu'ils peuvent effectuer. Chaque table de tâches indique quel travailleur a effectué cette tâche, quand et combien de temps cela a pris.Date la plus récente pour chaque identifiant, dans une table de syndication

Ainsi, les tables se présenter comme suit:

Table des travailleurs:

------------------------- 
|worker_id | worker_name| 
|----------|------------| 
|   |   | 

tables de tâches:

------------------------------------ 
|task_id | worker_id | date | time | 
|--------|-----------|------|------| 
|  |   |  |  | 

Chaque table de travail semble comme ci-dessus, appelé Task1, task2, TASK3. Il n'est pas possible de les avoir dans la même table car chaque tâche a d'autres colonnes spécifiques à elle-même qui ne sont pas requises pour cette union, mais qui sont utilisées ailleurs.

L'union des trois tables de travail à utiliser est la suivante:

SELECT `date`, time FROM task1 
UNION ALL SELECT `date`, time FROM task2 
UNION ALL SELECT `date`, time FROM task3 

Comment peut-on aller à écrire une instruction select, en utilisant l'union ci-dessus, pour revenir chaque identifiant et le nom des travailleurs, ainsi que la date et la durée de leur tâche la plus récente.

J'ai essayé d'utiliser la réponse choisie de la question suivante, mais en remplaçant la table wp_posts avec l'union des trois tables de travail, sans succès: MySQL order by before group by

+0

Je voudrais toujours avoir une table de tâches principale. – Strawberry

+0

Comment géreriez-vous différentes tâches ayant différentes autres colonnes? – user4370541

+0

Avoir les données de l'annexe dans des tableaux séparés, comme vous le suggérez, mais juste avoir les données communes stockées dans un seul endroit – Strawberry

Répondre

0

Je vais recommander le substring_index()/group_concat() astuce:

SELECT userid, max(date) as date, 
     substring_index(group_concat(time order by date desc), ',', 1) as time 
FROM (SELECT userid, `date`, time FROM task1 UNION ALL 
     SELECT userid, `date`, time FROM task2 UNION ALL 
     SELECT userid, `date`, time FROM task3 
    ) u 
GROUP BY userid; 

Ceci convertit time en une chaîne. Vous pouvez utiliser date_format() si vous le souhaitez dans un format particulier.

+0

Spot on - semble offrir une solution beaucoup plus simple que la question liée! – user4370541

+0

Les SELECT de l'UNION n'ont pas le même nombre de champs. Ajoutez l'ID utilisateur au début des 2ème et 3ème. –

+0

@RickJames. . . Je vous remercie. –