2017-07-19 2 views
-1

J'ai un système de facturation et j'essaie de générer des rapports sur les heures passées. J'enregistre chaque changement de commande, il y a donc plusieurs entrées pour presque chaque article sur chaque facture. Pour cette raison, je filtre les anciens changements et j'essaie de n'utiliser que les plus récents. Chaque instance partageant un ID de projet, un ID de phase et un même week-end est le même article sur la facture. Je souhaite générer un rapport et saisir uniquement les versions les plus récentes de ces éléments.Utiliser la date de création la plus récente dans le groupe par l'instruction

table Exemple:

id  project_id  phase_id  weekstart  created 
    --------------------------------------------------------------- 
    1  6    apple   2017-04-20 2017-04-23 
    2  6    apple   2017-04-20 2017-04-24 
    3  8    banana  2017-04-20 2017-04-23 
    4  9    pear   2017-04-20 2017-04-23 
    5  9    pear   2017-04-20 2017-04-25 

Je veux être en mesure d'exécuter une requête pour obtenir:

id  project_id  phase_id  weekstart  created 
    --------------------------------------------------------------- 
    2  6    apple   2017-04-20 2017-04-24 
    3  8    banana  2017-04-20 2017-04-23 
    5  9    pear   2017-04-20 2017-04-25 

Actuellement, je suis en utilisant quelque chose comme:

SELECT * from invoiceitems where employee_id = 10 
group by project_id, phase_id, weekstart 

Mais cette ne tient pas compte de la date de création.

La commande des résultats n'a aucun effet sur l'instruction group by. J'ai vérifié pour des messages similaires, mais seulement deux que j'ai trouvé cherchent à commander par la date de création la plus élevée ou ne sont pas regrouper les résultats par plusieurs colonnes.

+0

Pouvez-vous poster le résultat de la requête que vous utilisez? – Bdloul

+0

'SELECT *' n'est pas une clause SELECT valide dans une requête GROUP BY. Une requête 'GROUP BY' ne retourne pas de lignes de la table, elle ** génère ** à la volée la ligne qu'elle place sur le jeu d'enregistrements; pour chaque ligne générée, il utilise un groupe de lignes extraites de la requête. Il y a plusieurs valeurs pour 'id' dans un groupe (parce que' id' n'est pas dans la clause 'GROUP BY'), c'est pourquoi' id' dans la clause 'SELECT' est ambigu. Une requête 'GROUP BY' ** n'est pas ** la solution à votre question. – axiac

+1

@axiac C'est en quelque sorte la pointe de l'iceberg. –

Répondre

1

Joignez-vous à une sous-requête qui trouve les dernières heures de création pour chaque projet. Notez que nous utilisons GROUP BY ici, mais seulement dans la sous-requête, pour agréger sur les projets.

SELECT t1.* 
FROM invoiceitems t1 
INNER JOIN 
(
    SELECT project_id, phase_id, MAX(created) AS max_created 
    FROM invoiceitems 
    GROUP BY project_id 
) t2 
    ON t1.project_id = t2.project_id AND 
     t1.phase_id = t2.phase_id 
     t1.created = t2.max_created 
+0

I * think * 'phase' doit également être considéré – Strawberry

+0

@Strawberry Vous avez peut-être raison, mais étant donné que les données fournies ne semblent pas révéler cela, je ne changerai pas ma requête à moins que l'OP laisse un commentaire confirmant votre intuition . –

+0

phase_id doit être inclus. Ainsi que le week-end. Puis-je simplement regrouper les trois? –

-2

a été testée et fonctionne parfaitement

SELECT MAX(`id`) as `id`, `project_id`, `phase_id`, 
`weekstart`, MAX(`created`) as `created` 
FROM `invoiceitems` 
GROUP BY `project_id` 
ORDER BY `project_id` ASC 
+0

Rien ne garantit que 'MAX (id)' et 'MAX (created)' renvoient les valeurs qui se trouvent sur la même ligne de la table d'origine. Aussi, quand vous 'GROUP BY project_id' et vous' SELECT phase_id', s'il y a deux lignes avec le même 'project_id' mais différent' phase_id', le serveur [est libre de choisir la valeur désirée pour 'phase_id'] (https : //dev.mysql.com/doc/refman/5.7/en/group-by-handling.html). Le résultat de votre requête est indéterminé. – axiac

+0

Selon la question je pense que le 'id' est une colonne d'auto-incrémentation et très probablement la dernière date' created' aura le plus haut 'id' –

+0

Et aussi ce que je vois en question, il ressemble à' project_id' et 'phase_id' a une certaine relation entre eux, c'est pourquoi les 6 sont pour apple et 9 pour pear. –