mysql查询中的简单增量计数器

时间:2014-10-14 14:49:27

标签: mysql

我的查询:

SET @rank = 0;
SELECT Jobs.ID, Jobs.StatusID, (@rank:=@rank+1) AS Rank
FROM Jobs
INNER JOIN JobStatuses ON Jobs.StatusID = JSID
INNER JOIN JobStatusGroups ON Jobs.SGrID = JSGID
WHERE Jobs.StatusID = 3
ORDER BY JobTitle DESC
LIMIT 5

结果:

1010 3 1
1011 3 2
1013 3 4
1014 3 5
1016 3 7

应该导致:

1010 3 1
1011 3 2
1013 3 3
1014 3 4
1016 3 5

如果实际插入行,如何才使@rank仅增加?我试过cross join没有用。我也尝试了以下内容:

SELECT Jobs.ID, Jobs.StatusID, (@rank:=@rank+1) AS Rank
FROM Jobs, (SELECT @rank := 0) tempRank
INNER JOIN JobStatuses ON Jobs.StatusID = JSID
INNER JOIN JobStatusGroups ON Jobs.SGrID = JSGID
WHERE Jobs.StatusID = 3
ORDER BY JobTitle DESC
LIMIT 5

但是给我一个错误,说Jobs.StatusID不存在。

2 个答案:

答案 0 :(得分:1)

而不是将它设置在外面交叉连接它在选择中(我更喜欢交叉连接,因此它更容易阅读,我知道在哪里创建变量)这样计数不会搞砸了

INSERT IGNORE INTO MyTable(MyID, UserID, JobID, StatusID, SortOrder)
SELECT :myid, :userid, Jobs.ID, Jobs.StatusID, (@rank:=@rank+1) AS Rank
FROM Jobs
INNER JOIN JobStatuses ON Jobs.StatusID = JSID
CROSS JOIN (SELECT @rank := 0) temp
LEFT JOIN JobStatusGroups ON Jobs.SGrID = JSGID
WHERE ...
ORDER BY JobTitle DESC

在性能方面我还没有注意到在表格中使用变量实例化的性能问题

你可以尝试的一件事是,ORDER BY可能会破坏顺序/计数,因此你可以尝试将其封装在子选择中

SELECT ID, StatusID, (@rank:=@rank+1) AS Rank
FROM
(   SELECT Jobs.ID, Jobs.StatusID
    FROM Jobs
    INNER JOIN JobStatuses ON Jobs.StatusID = JSID
    INNER JOIN JobStatusGroups ON Jobs.SGrID = JSGID
    WHERE Jobs.StatusID = 3
    ORDER BY JobTitle DESC
    LIMIT 5
)t
CROSS JOIN (SELECT @rank := 0) temp

答案 1 :(得分:0)

试试这个更新的:

SET @rank = 0;
INSERT INTO MyTable(MyID, UserID, JobID, StatusID, SortOrder)
SELECT myid, userid, Jobs.ID, Jobs.StatusID, (@rank:=@rank+1) AS Rank
FROM Jobs
INNER JOIN JobStatuses ON Jobs.StatusID = JobStatuses.JSID
LEFT JOIN JobStatusGroups ON Jobs.SGrID = JobStatusGroups.JSGID
 ON DUPLICATE KEY update MyID=IF((@rank:=@rank-1) <> NULL IS NULL, VALUES(MyID), NULL);