我在我的一个应用程序中调整了一个脚本并且我遇到了阻塞。我有一个例行程序,基本上列出了所有候选人的面试,并打印了他们正在进行的职位空缺的面试轮次。这是数据库中的示例表。
+---------+-------------------+------------+
|contactid|interviewtime |assignmentid|
+---------+-------------------+------------+
|1 |2016-01-01 10:00:00| 1 |
+---------+-------------------+------------+
|1 |2016-01-02 10:00:00| 1 |
+---------+-------------------+------------+
|1 |2016-01-03 10:00:00| 1 |
+---------+-------------------+------------+
|1 |2016-01-04 10:00:00| 2 |
+---------+-------------------+------------+
|1 |2016-01-05 10:00:00| 2 |
+---------+-------------------+------------+
|1 |2016-01-03 10:00:00| 2 |
+---------+-------------------+------------+
我想制作如下内容:
+---------+-------------------+------------+-----+----+
|contactid|interviewtime |assignmentid|round|last|
+---------+-------------------+------------+-----+----+
|1 |2016-01-01 10:00:00| 1 |1 |no |
+---------+-------------------+------------+-----+----+
|1 |2016-01-02 10:00:00| 1 |2 |no |
+---------+-------------------+------------+-----+----+
|1 |2016-01-03 10:00:00| 1 |3 |yes |
+---------+-------------------+------------+-----+----+
|1 |2016-01-04 10:00:00| 2 |2 |no |
+---------+-------------------+------------+-----+----+
|1 |2016-01-05 10:00:00| 2 |3 |yes |
+---------+-------------------+------------+-----+----+
|1 |2016-01-03 10:00:00| 2 |1 |no |
+---------+-------------------+------------+-----+----+
我已经设法让输出工作在PHP中,但是我不得不做两个额外的查询来获得输出,这为我的执行时间增加了1.5秒。我想知道我是否可以让MySQL进行繁重的工作,并希望把这个时间缩短。我确信当前的实现将随着表的增长而成为瓶颈。
编辑[2016-10-31]
我正在使用此查询来添加计算行的窗口函数,但是我遇到了最后一块拼图的问题,也就是说这是否是最后一轮(最大值)。
SELECT a.round_number AS round, a.contactid, a.assignmentid
FROM (
SELECT @round_number:=CASE WHEN @contactid=contactid THEN @round_number+1 ELSE 1 END AS round_number,@contactid:=contactid AS contactid, assignmentid
FROM tbl_interviews, (SELECT @round_number:=0,@contactid:='') AS t
ORDER BY contactid DESC) AS a
WHERE a.contactid!= '0'
ORDER BY a.round_number DESC
在此之后,我向父SELECT添加了另一列:
(CASE WHEN MAX(a.round_number) < a.round_number THEN 'no' ELSE 'yes' END) AS last
然而,最后一个条件只返回一行而不是整个数据集,并且是在逃避我。我需要找到该组中的最大回合并在其上运行CASE函数。
答案 0 :(得分:0)
我不确定您现在使用的两个查询。 但是这样的事情会使最后一列有条件。
SELECT contacted, interviewtime, assignmetnid, round,
CASE WHEN round < 3 THEN last = 'no'
ELSE 'yes' END AS last
FROM Table