2

首先,这类似于这里更简单的 stack-o 问题,使用 MySQL,我如何在表中生成包含记录索引的列?,其中一般递增的列被添加到查询中。

但是,在这种情况下,我试图增加单个子组。

例如,考虑下表:

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

这可能吗?

4

2 回答 2

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,LEASTLENGTH只是作为变量赋值的容器。如您所见,这些函数基本上对查询的输出没有任何影响。

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

+------+----------+
| 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 |
+------+----------+-----------+

耶!

于 2013-10-02T22:23:48.840 回答
0

我要做的是在将数据插入数据库时​​,如果您使用的是 PHP,则查询数据库,搜索子组,如果存在,检查最新的增量,然后添加 1 并发布到数据库。如果子组不存在,请插入带有子组 4 的数据库并增加 1。如果您需要更多信息,请告诉我。

于 2013-10-02T18:37:32.180 回答