有这样一个表
id value
1    123
1    456
1    444
2    11
2    44
怎么得到
1 123 456 444
2 11  44
这种?

解决方案 »

  1.   

    select id,max(if(anum=1,values,0)) as a1,
    max(if(anum=2,values,0)) as a2,
    max(if(anum=3,values,0)) as a3
    from (
    select a.id,a.value,count(b.id) as anum
    from tt a  left join tt b on a.id=b.id and a.value>=b.id group by a.id,a.value) a1
    group by id
      

  2.   

    可以简单的用
    select id,group_concat(value)
    from 一个表
    group by id然后在你的程序中把逗号分隔符替换为TAB,或者直接处理。如果一定要分列,如果列数不确定的话,则只能通过你的程序或存储过程来实现。
      

  3.   

    谢谢两位
    我现在就是用的2楼所说这种,不过在网页表格里把结果放在一个格子了,用逗号隔开显示的
    1楼这个可行,貌似mysql不支持from子句子查询的,这个怎么可行的?
      

  4.   

    网页中的话,不如就用你现在的方法,对 group_concat(value) 返回进行一下处理效率反而比较高。比如你可以split 一下然后显示成多列<td>中去。
      

  5.   

    另外如果你的MySQL是4.1就支持子查询了不需要MySQL5。如果4.0以下则不行。关于MySQL如何生成row_number
    MySQL中的ROWNUM的实现 
    http://blog.csdn.net/ACMAIN_CHM/archive/2009/04/20/4095531.aspx
      

  6.   

    用PHP处理其实是比较好弄的,split能搞定。不过由于整个系统的框架的设置,这个得用smarty模板来处理,smarty没找到类似split的函数。用WWWWA这个方法,不过sql语句比较复杂,查询效率不是太好。
      

  7.   

    如果项目比较多或者本身记录很多的情况下用这种SQL语句效率会比较差。或者项目的数量不固定时,如果不能在程序中调整,则建议利用存储过程来实现了。通过存储过程把 order by  id, value 的记录放入临时表矩阵。
      

  8.   

    这个sql在加些别的查询条件,执行的速度比一般查询语句明显慢。不过现在数据也不是太多,查询时间显示还是0.多秒的样子。
    其实这个感觉还是用程序来弄比较合理。关于存储过程我还不会,所以没法弄。
    谢谢两位提供的方案了。