现有如下表及数据:
表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个.多谢指教!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
表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个.多谢指教!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
13800000000 江苏 常州 网站
13800000000 江苏 常州 电视
13800000001 江苏 无锡 报纸
13800000002 江苏 苏州
2.再做行列转换,使用case when end 方法。
如果没有上限,这个也不好做,只能使用PL/SQL 写个过程,
如果能够知道上限 10 ,那就在case when 里罗列出来吧。
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 |
+-------------+----------+--------------+---------+---------+
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;