所以我有这张桌子,我只想看看AB。
ID CODE COUNT
102 AB 9
101 AB 8
100 AC 23 //not important!!!!
99 AB 7
98 AB 6
97 AB 5
96 AB 0
我希望这个表看起来像这样
ID NEWID CODE COUNT
102 102 AB 9
101 101 AB 8
99 100 AB 7
98 99 AB 6
97 98 AB 5
96 97 AB 0
如何获得一个连续计算代码为AB的新ID?
然后将其用于SELECT查询,初始表应该保持不变,因此这不是更新表而只是制作虚构的NEWID。
答案 0 :(得分:1)
您可以使用用户变量创建一个计数器来完成此操作(仅在一个查询中!):
SELECT t.ID, @NEWID := COALESCE(@NEWID - 1, t.ID) AS NEWID, t.CODE, t.COUNT
FROM
(SELECT ID, CODE, COUNT FROM some_table WHERE CODE = 'AB' ORDER BY ID DESC) t,
(SELECT @NEWID := NULL) _uv;
mysql> SELECT t.ID, @NEWID := COALESCE(@NEWID - 1, t.ID) AS NEWID, t.CODE, t.COUNT
-> FROM
-> (SELECT ID, CODE, COUNT FROM some_table WHERE CODE = 'AB' ORDER BY I
D DESC) t,
-> (SELECT @NEWID := NULL) _uv;
+------+-------+------+-------+
| ID | NEWID | CODE | COUNT |
+------+-------+------+-------+
| 102 | 102 | AB | 9 |
| 101 | 101 | AB | 8 |
| 99 | 100 | AB | 7 |
| 98 | 99 | AB | 6 |
| 97 | 98 | AB | 5 |
| 96 | 97 | AB | 0 |
+------+-------+------+-------+
6 rows in set (0.03 sec)
修改:这是SQL Fiddle。 (这是一个很酷的工具。我不知道这个存在!)
答案 1 :(得分:0)
您可以使用:
SELECT
Id, @newid := @newid - 1 as NEWID, CODE, CNT
FROM Tbl,
(SELECT @newid := MAX(ID) + 1 FROM Tbl) A
WHERE CODE != 'AC'
ORDER BY NEWID DESC
<强> SQL FIDDLE 强>
答案 2 :(得分:0)
试试这个:
SELECT MIN(ID) - 1
FROM tab
WHERE CODE = 'AB'
INTO @i;
SELECT tab.ID, (@i := @i + 1) AS NEWID, tab.COUNT
FROM tab
WHERE tab.CODE = 'AB'
ORDER BY tab.ID;