仅使用mySQL扩展mySQL表

时间:2011-08-31 23:50:18

标签: mysql

假设我有一个mySQL表,其结构如下:

mysql> select * from things_with_stuff;
+----+---------+----------+
| id | counter | quantity |
+----+---------+----------+
|  1 |     101 |        1 |
|  2 |     102 |        2 |
|  3 |     103 |        3 |
+----+---------+----------+

我的目标是“扩展”表格,所以我最终得到的结果是:

mysql> select * from stuff;
+----+---------+
| id | counter |
+----+---------+
|  1 |     101 |
|  2 |     102 |
|  3 |     102 |
|  4 |     103 |
|  5 |     103 |
|  6 |     103 |
+----+---------+

我想只使用mysql进行“扩展”。请注意,我最终每个数量和每个计数器都有一行。有什么建议?存储过程不是一个选项(我知道它们提供while循环)。

谢谢!

3 个答案:

答案 0 :(得分:2)

只要some_large_table的长度大于或等于quantity中的最大things_with_stuff,以下内容即可实现。例如,让some_large_table成为数据仓库中的一个重要事实表。

SELECT @kn:=@kn+1 AS id, counter
FROM (SELECT @kn:=0) k, things_with_stuff ts
INNER JOIN (
    SELECT @rn:=@rn+1 AS num
    FROM (SELECT @rn:=0) t, some_large_table
    ) nums ON num <= ts.quantity;

答案 1 :(得分:0)

假设quantity有最大值,您可以这样做:

INSERT INTO things SELECT counter FROM things_with_stuff WHERE quantity > 0;
INSERT INTO things SELECT counter FROM things_with_stuff WHERE quantity > 1;
INSERT INTO things SELECT counter FROM things_with_stuff WHERE quantity > 2;
--... and so on until the max.

这有点像黑客但它应该可以胜任。

如果订购很重要,您可以在事后进行清理。

答案 2 :(得分:0)

我有时在数据库中有一个名为num(数字)的表,其中包含一列i,填充了1到1000000之间的所有整数。制作这样的表并填充它并不难。

如果stuff.id自动递增,您可以使用此功能:

INSERT INTO stuff
( counter )
    SELECT ts.counter
    FROM things_with_stuff AS ts
      JOIN num
        ON num.i <= ts.quantity