我的查询:
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
不存在。
答案 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);