首先,这是类似到这里更简单的stack-o问题,With MySQL, how can I generate a column containing the record index in a table?,其中将一般增量列添加到查询中。
但是,在这种情况下,我试图增加各个子组。
例如,请考虑下表:
name sub-group note
john 1 yes
doe 1 no
bill 1 maybe
greg 2 so
dan 2 blue
jim 3 white
哪个查询将输出一个表,其中每个子组递增一列,如下所示:
name sub-group note increment
john 1 yes 1
doe 1 no 2
bill 1 maybe 3
greg 2 so 1
dan 2 blue 2
jim 3 white 1
这可能吗?
答案 0 :(得分:2)
我已经解决了这个问题,感谢来自这里最优秀博客文章的帮助:http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/
解决方案非常重要,需要变量和一些关于mysql如何对其查询操作进行排序的高级知识,但它看起来相当高效。其中一个关键是变量赋值可以隐藏在函数调用中!
基本上,以下查询解决了问题:
SET @num := 0, @type := '';
SELECT name, subgroup, @num AS increment
FROM table_name
WHERE 0 <= GREATEST(
@num := IF(@type = subgroup, @num + 1, 1),
LEAST(0, LENGTH(@type := subgroup)))
函数GREATEST
,LEAST
和LENGTH
就是变量赋值的容器。如您所见,这些函数基本上不会影响查询的输出。
但是,我还发现我的表中的“子组”值不是连续的。例如:
+------+----------+
| name | subgroup |
+------+----------+
| john | 1 |
| doe | 1 |
| jim | 1 |
| greg | 2 |
| boe | 2 |
| amos | 3 |
| ben | 1 |
| gary | 2 |
+------+----------+
在输出表中导致如下:
+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1 | 1 |
| doe | 1 | 2 |
| jim | 1 | 3 |
| greg | 2 | 1 |
| boe | 2 | 2 |
| amos | 3 | 1 |
| ben | 1 | 1 |
| gary | 2 | 1 |
+------+----------+-----------+
由于执行顺序,将ORDER BY
子句放到查询末尾不起作用,并且隐藏ORDER BY
子句中的变量赋值更接近但有自己的问题,所以这里是我使用的最终查询:
SET @num := 0, @type := '';
SELECT name, subgroup, @num AS increment
FROM (SELECT * FROM table_name ORDER BY subgroup) AS table_name2
WHERE 0 <= GREATEST(
@num := IF(@type = subgroup, @num + 1, 1),
LEAST(0, LENGTH(@type := subgroup)))
导致以下输出:
+------+----------+-----------+
| name | subgroup | increment |
+------+----------+-----------+
| john | 1 | 1 |
| doe | 1 | 2 |
| jim | 1 | 3 |
| ben | 1 | 4 |
| greg | 2 | 1 |
| boe | 2 | 2 |
| gary | 2 | 3 |
| amos | 3 | 1 |
+------+----------+-----------+
耶!
答案 1 :(得分:0)
我要做的是在将数据插入数据库时,如果您使用的是PHP,则查询数据库,搜索子组(如果存在),检查最新的增量,然后添加1并发布到数据库。如果该子组不存在,请使用子组4插入数据库并增加1.如果您需要更多信息,请告诉我。