2015-11-12 2 views
3

Моей таблица выглядит следующим образом:MySQL, группа два разных колонн

╔═════╦═════════════════════╦═════════════════════╦═════════════╗ 
║ id ║  begin  ║   end   ║ employeesId ║ 
╠═════╬═════════════════════╬═════════════════════╬═════════════╣ 
║ 4 ║ 2015-11-11 00:00:00 ║ 2015-11-11 09:00:00 ║   8 ║ 
║ 80 ║ 2015-11-11 09:00:00 ║ 2015-11-11 12:00:00 ║   8 ║ 
║ 49 ║ 2015-11-11 00:00:00 ║ 2015-11-11 08:00:00 ║   61 ║ 
║ 32 ║ 2015-11-11 08:00:00 ║ 2015-11-12 06:00:00 ║   61 ║ 
║ 42 ║ 2015-11-12 07:00:00 ║ 2015-11-12 13:00:00 ║   61 ║ 
║ 17 ║ 2015-11-11 00:00:00 ║ 2015-11-11 08:00:00 ║   22 ║ 
║ 42 ║ 2015-11-11 09:00:00 ║ 2015-11-11 12:00:00 ║   22 ║ 
╚═════╩═════════════════════╩═════════════════════╩═════════════╝ 

Я хочу, чтобы объединить строки, где столбцы employeesId равны, и begin время одной строки равен end времени другой строки. Как это:

╔═════════════════════╦═════════════════════╦═════════════╗ 
║  begin  ║   end   ║ employeesId ║ 
╠═════════════════════╬═════════════════════╬═════════════╣ 
║ 2015-11-11 00:00:00 ║ 2015-11-11 12:00:00 ║   8 ║ 
║ 2015-11-11 00:00:00 ║ 2015-11-12 06:00:00 ║   61 ║ 
║ 2015-11-12 07:00:00 ║ 2015-11-12 13:00:00 ║   61 ║ 
║ 2015-11-11 00:00:00 ║ 2015-11-11 08:00:00 ║   22 ║ 
║ 2015-11-11 09:00:00 ║ 2015-11-11 12:00:00 ║   22 ║ 
╚═════════════════════╩═════════════════════╩═════════════╝ 

редактировать:

Мне нужно объединить непрерывные DateTimes, в этом примере вы можете видеть, что время окончания '2015-11-11 12:00:00' для employeesId = 8 заменил время окончания «2015-11-11 09:00:00» в первой строке, потому что начало второй строки равно концу первой строки.

+2

* Я хочу, чтобы что-то вас удерживало? –

+0

Извините, мне нужно, но мне это не удалось, поэтому я прошу помочь здесь. :) – Luka

+2

Просьба пояснить, что вы пробовали, что не сработало, или что у вас в противном случае были проблемы с –

ответ

2

Попробуйте присоединиться

SELECT a.`begin_date`, IF(b.`end_date` IS NOT NULL, b.`end_date`, a.`end_date`), a.`employer_id` 
FROM `mytable` a 
LEFT JOIN `mytable` b ON a.`employer_id` = b.`employer_id` AND a.`end_date` = b.`begin_date` 
LEFT JOIN `mytable` c ON a.`employer_id` = c.`employer_id` AND a.`begin_date` = c.`end_date` 
WHERE c.`id` IS NULL 

Но вы должны восстановить свою схему.

+0

Из-за 'begin' и' end' являются ключевыми словами для SQL, вам придется использовать обратные тики вокруг их –

+0

@SamSwift вот так? ;) – ventaquil

+1

Да, совершенство! Haha –

-1

Я бы предпочел, чтобы это был комментарий, но из-за кода и обратных тиков он должен быть таким образом. Мое предложение было бы использовать DISTINCT:

SELECT DISTINCT `id`, * FROM `mytable` WHERE `condition` = 'what you want to match'; 

Я не совсем уверен, что если отчетливая будет охватывать все столбцы или просто id, если это так может кто-нибудь, пожалуйста, комментарий, чтобы сообщить мне и О.П. знать ?

0

Вы можете использовать MIN(),MAX(), если хотите получить более раннее и позднее время.

SELECT MIN(begin),MAX(end),employeesId 
    FROM table_name 
    GROUP BY employeesId 

Надеется, что это помогает

+0

... пока сотрудник никогда не работает там снова. – Strawberry

+0

@Strawberry, что не так с этим утверждением? Я просто пробовал это для удовольствия на mysql и вернул правильные результаты? –

+0

Это работает для данного примера, но не работает, если вы добавляете строку типа: begin (2015-11-11 09:00:00), конец (2015-11-11 12:00:00), employeersId (22) – Luka

Смежные вопросы