正如标题所说,我想在同一行中选择不同的值作为不同的列
示例:
ID CATEGORY
1 5
1 6
1 8
2 5
2 7
3 5
我想要这样的事情:
ID CATEGORY1 CATEGORY2 CATEGORY3
1 5 6 8
2 5 7
3 5
只有一个查询可用吗?
答案 0 :(得分:1)
获得此类内容的最简单方法是使用group_concat()
:
select id, group_concat(category order by category)
from table t
group by id;
但是,它会创建一个附加列,其中包含值列表,而不是三列。这是否足以满足您的目的?
如果您想要三个额外的列,那么您将需要一个更复杂的语句。以下是使用变量的一种方法:
select id,
max(case when seqnum = 1 then category end) as category1,
max(case when seqnum = 2 then category end) as category2,
max(case when seqnum = 3 then category end) as category3
from (select t.*,
(@rn := if(@id = id, @rn + 1,
if(@id := id, 1, 1)
)
) as seqnum
from table t cross join
(select @rn := 0, @id := NULL) vars
order by id, category
) t
group by id;