说我有一个表'字母'。这只是一个基本的表示/示例。
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()的限制偏移调用来执行三次调用。但/这可能/只能在一次通话中完成吗?
答案 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不按顺序,这也会有效。