Строки заказа в соединительной таблице mysql

0

У меня есть таблица с диапазонами дат. Я хочу искать промежутки между этими диапазонами. Я понял, что могу оставить таблицу соединений и вычислить разницу.

Текущая таблица:

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, я вижу, что в результате есть правильные строки. Я просто не могу понять, как их получить.

Есть ли способ сортировки таблицы перед объединением?

Теги:
join

1 ответ

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

Я не уверен, что это решит проблему существа.

  • 0
    Да уж. Я думаю, что я сделаю что-то с подзапросом. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню