2016-07-28 82 views
0

我正在调整我的一个应用程序中的脚本,并且遇到了一个阻止。我有一个例行公事,主要列出了所有的求职面试,并为他们正在进行的职位空缺列印了面试回合。这是数据库中的一个示例表。MySQL组增量

+---------+-------------------+------------+ 
|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中的工作,但我不得不这样做2个额外的查询来获得输出,这对我的执行时间增加了1.5秒。我想知道我是否可以让MySQL来完成繁重的工作,并希望能够把这一次降下来。我相信我目前的实施将成为桌子增长的瓶颈。

EDIT [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 

在这之后,我又增加了列于母公司选择:

(CASE WHEN MAX(a.round_number) < a.round_number THEN 'no' ELSE 'yes' END) AS last 

然而,这最后一个条件是只返回一行,而不是整个数据集,并躲避我。我需要在该组中找到最大轮次并在其上运行CASE功能。

+0

不,不是真的。 mysql没有窗口函数。但是,这在客户端代码中看起来很容易。只需保留“上一个”行的记录,以便您可以将其与当前行进行比较,并适当增加/重置您的循环计数器。 –

+0

谢谢马克,这正是我目前正在做的,但在'成本'。 – Rich

回答

0

我不完全确定你现在用什么两个查询来运行。 但是为什么这样做使最后一列有条件。

SELECT contacted, interviewtime, assignmetnid, round, 
CASE WHEN round < 3 THEN last = 'no' 
ELSE 'yes' END AS last 
FROM Table 
+0

op想要标记任何一组回合的最后一个。你只会打3分。关于4轮呢? 2 rounsd? –

+0

有效点..我正在脱离他的例子,其中3轮案件是最后一轮。 – brunzzy

+0

'怎么样?当轮