在连接表mysql中排序行

时间:2010-09-17 09:26:09

标签: mysql join

我有一张包含日期范围的表格。我想寻找这些范围之间的差距。 我已经想通了,我可以将联合表留给自己并计算差异。

当前表:

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

我想得到:

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

我使用以下查询:

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

但结果是

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

如果删除GROUP BY,我可以看到结果中有正确的行。我只是无法弄清楚如何得到它们。

有没有办法在加入之前对表进行排序?

1 个答案:

答案 0 :(得分:2)

如果希望在连接之前对表中的行进行排序,则可以将连接中的一个或两个实际表替换为这样的派生表...

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

我不确定这是否能解决实质性问题。