我正在调整我的一个应用程序中的脚本,并且遇到了一个阻止。我有一个例行公事,主要列出了所有的求职面试,并为他们正在进行的职位空缺列印了面试回合。这是数据库中的一个示例表。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功能。
不,不是真的。 mysql没有窗口函数。但是,这在客户端代码中看起来很容易。只需保留“上一个”行的记录,以便您可以将其与当前行进行比较,并适当增加/重置您的循环计数器。 –
谢谢马克,这正是我目前正在做的,但在'成本'。 – Rich