2010-09-17 8 views
0

J'ai une table avec des plages de dates. Je veux rechercher les écarts entre ces plages. J'ai compris que je pouvais quitter la table et calculer la différence.Ordre des lignes dans la table de jointures mysql

tableau actuel:

date_begin date_end 
2010-08-01 2010-08-15 
2010-08-16 2010-08-30 
2010-08-31 2010-09-12 
2010-10-01 2010-10-15 

Je veux obtenir:

date_begin date_end - date_begin2 DATEDIFF(date_begin2 - date_end) 
           2010-08-01  
2010-08-01 2010-08-15  2010-08-16  ... 
2010-08-16 2010-08-30  2010-08-31  ... 
2010-08-31 2010-09-12  2010-10-01  ... 
2010-10-01 2010-10-15 

J'utilise la requête suivante:

SELECT pay1.date_begin, pay1.date_end, 
     pay2.date_begin, pay2.date_end, DATEDIFF(pay2.date_begin, pay1.date_end) 
FROM `payment_employees` AS pay1 
LEFT JOIN `payment_employees` AS pay2 ON pay2.date_begin > pay1.date_end 
GROUP BY pay1.date_begin 
ORDER BY pay1.date_begin ASC 

Mais le résultat est

pay1.date_begin date_end pay2.date_begin date_end    difference 
2010-08-01 2010-08-15 2010-08-31 2010-09-12   16 wrong 
2010-08-16 2010-08-30 2010-08-31 2010-09-12   1 correct 
2010-08-31 2010-09-12 2010-10-01 2010-10-15   19 correct 
2010-10-01 2010-10-15 NULL    NULL 

Si je supprime le groupe par je peux voir qu'il y a des lignes correctes dans le résultat. Je ne peux pas comprendre comment les obtenir.

Existe-t-il un moyen de trier une table avant de la joindre?

Répondre

2

Si vous voulez que les lignes dans vos tables triées avant d'être rejoint, vous pouvez remplacer l'une ou l'autre des vraies tables dans la jointure avec les tables dérivées comme celui-ci ...

SELECT pay1.date_begin, 
     pay1.date_end, 
     pay2.date_begin, 
     pay2.date_end, 
     DATEDIFF(pay2.date_begin, pay1.date_end) 
    FROM (SELECT * 
       FROM `payment_employees` 
       ORDER BY date_begin) AS pay1 
      LEFT JOIN (SELECT * 
         FROM `payment_employees` 
         ORDER BY date_end) AS pay2 
      ON pay2.date_begin > pay1.date_end 
    GROUP BY pay1.date_begin 
    ORDER BY pay1.date_begin ASC 

Je ne suis pas sûr si cela résout le problème de fond, cependant.

+0

Oui. Je pense que je ferai quelque chose avec la sous-requête. Merci – undsoft

Questions connexes