将结果拆分为三列

时间:2014-05-18 17:25:51

标签: mysql

说我有一个表'字母'。这只是一个基本的表示/示例。

id    word
1     a
2     b
3     c
4     d
5     e
6     f
7     g
8     h
9     i
10    j
11    k
12    l
13    m

现在假设由于语言限制或其他原因,我仅限于一个查询(带子查询)。

我希望我的'结果'如下:

row   col1   col2   col3
1     a      b      c
2     d      e      f  
3     g      h      i
4     j      k      l
5     m

现在我已经通过按照这里的说明模拟MySQL中的完全外部联接来接近这一点:Full Outer Join in MySQL结合同一个表上的子查询使用以下内容:< / p>

SELECT id,word FROM table WHERE MOD(id,3)=1

这并不是特别完美,因为它要求我假设id完全按顺序相互跟随,但我当时还没有想到更好的方法。从上次回忆起,LIMIT和OFFSET不接受子查询。

但是,按照这个想法,结果就是:

row   col1   col2   col3
1     a
2     d
3     g
4     j
5     m
6            b
7            e
8            h
9            k
10                  c
11                  f
12                  i
13                  l
13                  m

有没有办法获得我想要的格式? 请注意,通常情况下,所需的方法是使用基于count()的限制偏移调用来执行三次调用。但/这可能/只能在一次通话中完成吗?

4 个答案:

答案 0 :(得分:1)

这是你需要的吗?

SELECT FLOOR((col1.id - 1) / 3 + 1) AS id, col1.word AS col1, col2.word AS col2, col3.word AS col3
FROM alphabet col1 
    LEFT JOIN alphabet col2 ON col1.id = col2.id - 1
    LEFT JOIN alphabet col3 ON col2.id = col3.id - 1
WHERE col1.id % 3 = 1;

答案 1 :(得分:1)

我没有找到任何用例,但这是你想要的:

SELECT
  FLOOR((id - 1)/3) + 1 id,
  MAX(CASE WHEN MOD(id - 1,3) = 0 THEN word END) col1,
  MAX(CASE WHEN MOD(id - 1,3) = 1 THEN word END) col2,
  MAX(CASE WHEN MOD(id - 1,3) = 2 THEN word END) col3
FROM tbl
GROUP BY FLOOR((id - 1)/3)

<强> SQLFIDDLE DEMO

请注意,这仅适用于从1开始的顺序ID。

答案 2 :(得分:0)

这样的东西
Select t1.id as `row`, t1.word as col1, t2.word as col2, t3.word as col3
From alphabet t1
left join alphabet t2 on t2.id = t1.id + 5
left join alphabet t3 on t3.id = t1.id + 10 
Where t1.id <= 5

答案 3 :(得分:0)

采取哈姆雷特哈博伊恩的回答,完成这个:

SELECT
FLOOR((rank - 1)/3) + 1 rank,
  MAX(CASE WHEN MOD(rank - 1,3) = 0 THEN word END) col1,
  MAX(CASE WHEN MOD(rank - 1,3) = 1 THEN word END) col2,
  MAX(CASE WHEN MOD(rank - 1,3) = 2 THEN word END) col3
FROM (SELECT @rn:=@rn+1 AS rank, `id`,`word` from tbl) as tbl, (SELECT @rn:=0) t2
GROUP BY FLOOR((rank - 1)/3)

<强> SQLFIDDLE DEMO

即使ID不按顺序,这也会有效。