子组如何在sql查询中添加生成的增量列?

时间:2013-10-02 18:32:38

标签: mysql sql

首先,这是类似到这里更简单的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

这可能吗?

2 个答案:

答案 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)))

函数GREATESTLEASTLENGTH就是变量赋值的容器。如您所见,这些函数基本上不会影响查询的输出。

但是,我还发现我的表中的“子组”值不是连续的。例如:

+------+----------+
| 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.如果您需要更多信息,请告诉我。