合并具有唯一属性的两行

bot*_*bot 11 php mysql sql max

这是我的表的示例输出(time_entries)

user_name| entry_type   | entry_datetime
 User1   |   Time In    | 28-JUL-13  16:40:40
 User1   |   Time Out   | 28-JUL-13  16:40:41
 User2   |   Time In    | 28-JUL-13  16:41:13
 User2   |   Time Out   | 28-JUL-13  16:41:15
 User1   |   Time In    | 27-JUL-13  16:42:30
 User1   |   Time Out   | 27-JUL-13  16:42:34
 User2   |   Time In    | 27-JUL-13  16:43:32
 User2   |   Time Out   | 27-JUL-13  16:43:35
Run Code Online (Sandbox Code Playgroud)

现在我使用了这个查询

SELECT te.user_name, te.entry_name, MAX(te.entry_datetime) AS date
FROM time_entries AS te
GROUP BY te.entry_type, te.user_name
Run Code Online (Sandbox Code Playgroud)

结果是这样的

user_name| entry_type   | entry_datetime
 User1   |   Time In    | 28-JUL-13  16:40:40
 User1   |   Time Out   | 28-JUL-13  16:40:41
 User2   |   Time In    | 28-JUL-13  16:41:13
 User2   |   Time Out   | 28-JUL-13  16:41:15
Run Code Online (Sandbox Code Playgroud)

问题:有没有办法在1行中合并用户名和相同名称?并有一个像这样的输出.

user_name|  Date     | Timein   | Timeout
User1    | 28-JUL-13 | 16:40:40 | 16:40:41
User2    | 28-JUL-13 | 16:41:13 | 16:41:15
Run Code Online (Sandbox Code Playgroud)

我有点混淆怎么做.

Ja͢*_*͢ck 6

我会以这种方式接近它:

  1. 创建一个返回每个用户和日期的"time in"时间的查询.
  2. 创建一个像#1这样的查询,返回每个用户和日期的"超时"时间.
  3. 使用LEFT JOIN将结果合并在一起.

最终结果:

SELECT te.user_name, LEFT(te.entry_datetime, 10) AS entry_date, cin.entry_datetime AS timein, cout.entry_datetime AS timeout
FROM time_entries te
LEFT JOIN (SELECT user_name, LEFT(entry_datetime, 10) AS entry_date, MIN(entry_datetime) AS entry_datetime
    FROM time_entries
    WHERE entry_type = 'Time In'
    GROUP BY user_name, entry_date
) cin ON cin.user_name = te.user_name AND cin.entry_date = LEFT(te.entry_datetime, 9)
LEFT JOIN (SELECT user_name, LEFT(entry_datetime, 10) AS entry_date, MAX(entry_datetime) AS entry_datetime
    FROM time_entries
    WHERE entry_type = 'Time Out'
    GROUP BY user_name, entry_date
) cout ON cout.user_name = te.user_name AND cout.entry_date = LEFT(te.entry_datetime, 10)
GROUP BY te.user_name, entry_date;
Run Code Online (Sandbox Code Playgroud)

演示

顺便说一句,我在LEFT()这里使用,因为你的列不包含MySQL理解的实际日期格式.