将一行排成多行

时间:2015-04-23 05:51:47

标签: mysql sql

我有一些像这样的行:

 school      4
 hotel       2
 restaurant  6

我想这样输出:

 school 1
 school 2
 school 3
 school 4
 hotel 1
 hotel 2
 restaurant 1
 ...
 restaurant 6

我是否可以运行MySQL查询来输出它(即输出的行数对应于第二个字段中的数字)?

2 个答案:

答案 0 :(得分:1)

感谢JB Nizet告诉我,MySQL无法轻易地在它自己的基础上做到这一点。它鼓舞了我编写这个PHP脚本:

$result = mysqli_query($dbc,"select abbrev,chapters from books");
while ($output = mysqli_fetch_array($result,MYSQL_ASSOC)) {
 for ($i=1; $i<=$output['chapters']; $i++) {
  echo "{$output['abbrev']}$i\n";
 }
}

答案 1 :(得分:1)

在Oracle或PostgreSQL中,使用行生成器可以相对简单地解决这种问题。不幸的是,MySQL没有任何简单的生成行的方法,你必须手动完成。你必须创建一个视图。

create or replace view generator_16 as
  select 0 n union all select 1  union all select 2  union all
  select 3   union all select 4  union all select 5  union all
  select 6   union all select 7  union all select 8  union all
  select 9   union all select 10 union all select 11 union all
  select 12  union all select 13 union all select 14 union all
  select 15;

此视图有一列n015的16行。使用此视图,您可以编写如下查询:

select a.name, b.n 
from t a, generator_16 b 
where b.n <= a.n and b.n > 0;

由于视图行从0开始,因此需要额外的过滤条件b.n > 0来排除0。如果您定义一个从1开始的视图,则不需要附加条件。

我认为这个数字很小(低于16)。如果你必须处理超过15的数字的情况,那么你应该定义另一个包含256行的视图:

create or replace view generator_256 as
  select (hi.n*16 + lo.n) as n
  from generator_16 hi, generator_16 lo;

然后更新查询以使用generator_256

有关generator_16generator_256观看次数的详细说明,阅读MySQL Row Generator会对您有所帮助。