现有如下表及数据:
表a:
tel(pk)        province        municipality
13800000000    江苏            常州
13800000001    江苏            无锡
13800000002    江苏            苏州
......表b:
tel            source
13800000000    网站
13800000000    电视
13800000001    报纸
......我想通过sql语句的查询得到如下结果:
tel            province        municipality       source1        source2
13800000000    江苏            常州               网站           电视     
13800000001    江苏            无锡               报纸
13800000002    江苏            苏州
几点说明:
1,source的个数不一定,如果有困难可以给出一个上限如10个.多谢指教!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    1.先做表关联,得到如下,同一个号码会有多条记录。
    13800000000 江苏 常州 网站
    13800000000 江苏 常州 电视
    13800000001 江苏 无锡 报纸
    13800000002 江苏 苏州
    2.再做行列转换,使用case when end 方法。
    如果没有上限,这个也不好做,只能使用PL/SQL 写个过程,
    如果能够知道上限 10 ,那就在case when 里罗列出来吧。
      

  2.   

    CREATE TABLE a (
    tel VARCHAR(20) PRIMARY KEY , province VARCHAR(10),municipality VARCHAR(10))engine=myisam;
    INSERT a SELECT 
    '13800000000', '江苏', '常州' UNION ALL SELECT 
    '13800000001', '江苏', '无锡'  UNION ALL SELECT 
    '13800000002', '江苏', '苏州';CREATE TABLE b(
    tel VARCHAR(20), source VARCHAR(10)) engine=myisam;
    INSERT b SELECT 
    '13800000000', '网站' UNION ALL SELECT 
    '13800000000', '电视' UNION ALL SELECT 
    '13800000001', '报纸';ALTER TABLE b ADD id INT NOT NULL auto_increment,
      ADD PRIMARY KEY(tel,id);SET @str='';SELECT @str:=concat(@str,',max(case when id=',trim(id),' then source end) as source',trim(id)) 
    FROM (SELECT DISTINCT id FROM b ) k;SET @str=concat('select a.tel,a.province,a.municipality',@str,' from a left join b on a.tel=b.tel group by a.tel,a.province,a.municipality ');prepare stm FROM @str;
    EXECUTE stm;
    mysql> EXECUTE stm;
    +-------------+----------+--------------+---------+---------+
    | tel         | province | municipality | source1 | source2 |
    +-------------+----------+--------------+---------+---------+
    | 13800000000 | 江苏     | 常州         | 网站    | 电视    |
    | 13800000001 | 江苏     | 无锡         | 报纸    | NULL    |
    | 13800000002 | 江苏     | 苏州         | NULL    | NULL    |
    +-------------+----------+--------------+---------+---------+
      

  3.   

    如果你不想改变b表结构 你可以这样然后把上面代码对b做过的事情 全在b_tmp上做..create table b_tmp select * from b;
    ALTER TABLE b_tmp ADD id INT NOT NULL auto_increment,
                  ADD PRIMARY KEY(tel,id);SET @str='';SELECT @str:=concat(@str,',max(case when id=',trim(id),' then source end) as source',trim(id)) 
    FROM (SELECT DISTINCT id FROM b_tmp ) k;SET @str=concat('select a.tel,a.province,a.municipality',@str,' from a left join b_tmp b on a.tel=b.tel group by a.tel,a.province,a.municipality ');prepare stm FROM @str;
    EXECUTE stm;