MYSQL left join逗号,问题(超变态,一般人勿进)

光光哥 2016-04-30 04:40:22
A表是
id name Bids(varchar)
1 张三 1,2
2 李四 1,2,3

B表
id qx(varchar)
1 上传管理员
2 订单管理员
3 后台管理员

怎么查出
1 张三 上传管理员,订单管理员
2 李四 上传管理员,订单管理员,后台管理员
...全文
937 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
???melon 2019-12-23
  • 打赏
  • 举报
回复
group_concat
某程序员 2017-08-08
  • 打赏
  • 举报
回复
< 10 可以用like...
北飞的企鹅 2017-08-07
  • 打赏
  • 举报
回复
你这个数据库设计的有问题吧
qq_38321773 2017-08-07
  • 打赏
  • 举报
回复
可以试试like
一件风飘血 2017-08-07
  • 打赏
  • 举报
回复
这个问题最后是怎么解决的呢
thz18817961076 2016-05-09
  • 打赏
  • 举报
回复
最好在再建一个表把A表和B表关联起来吧
Intboy 2016-05-04
  • 打赏
  • 举报
回复
程序处理,或者存储过程处理
丨蒋天丨 2016-05-04
  • 打赏
  • 举报
回复
如果数据库里不能分割,那就获取到后台中分割,进行查询拼接
奄灬苟且偷生 2016-05-03
  • 打赏
  • 举报
回复
说实话我还真么这么做过,等大神
jamesge2010 2016-05-03
  • 打赏
  • 举报
回复
对于多对一的结构建议你在表中插入多条数据的结构,比如 1 张三 1 1 张三 2 这样查询和维护都会方便很多。
小灰狼 2016-05-03
  • 打赏
  • 举报
回复
不得不说,楼主的数据库设计很糟糕 最开始设计数据表时,为了省事,把一些关系全部放到一个字段里,为后来的使用带来很多麻烦 从数据库原理来看,连第一范式都没有达到:每个字段是不可以再拆分的属性
小灰狼 2016-05-03
  • 打赏
  • 举报
回复

drop table if exists `tbA`;
create table `tbA` (
	`id` int primary key, 
	`name` varchar(10), 
	`bids` varchar(100)
);

insert into `tbA` values(1, '张三', '1,2');
insert into `tbA` values(2, '李四', '1,2,3');

drop table if exists `tbB`;
create table `tbB` (
	`id` int primary key,
	`qx` varchar(10)
);

insert into `tbB` values(1, '上传管理员');
insert into `tbB` values(2, '订单管理员');
insert into `tbB` values(3, '后台管理员');

drop procedure if exists `fnGetName`;
drop function if exists `fnGetName`;
delimiter ;;
create function `fnGetName`(
	p_ids varchar(10)
) returns varchar(100)
begin 
	declare p int;
	declare v_result varchar(100);
	declare v_ids varchar(10);
	declare v_id int UNSIGNED;
	declare v_qx varchar(10);
	declare v_split varchar(2);
	

	set v_result = '';
	set v_ids = p_ids;
	set v_split = '';
	
	repeat 
		set p = INSTR(v_ids, ',');
		if p > 0 then 
			set v_id = cast(SUBSTR(v_ids FROM 1 for p-1) as unsigned);
			set v_ids = SUBSTR(v_ids, p + 1);
		else 
			set v_id = cast(v_ids as unsigned);
			set v_ids = '';
		end if;
		
		select `qx` into v_qx from `tbB` where `id` = v_id;
		set v_result = concat(v_result, v_split, v_qx);
		set v_split = ', ';
		
	until LENGTH(v_ids) <= 0 end repeat;
	return v_result;
	
end;;

delimiter ;

select `id`, `name`, `fnGetName`(`bids`) from `tbA`;

attilax 2016-05-02
  • 打赏
  • 举报
回复
自定义函数即可。。第一步,拆分A表一个记录为多条,然后join查询,,得到一个结果表。至于显示 1 张三 上传管理员,订单管理员 2 李四 上传管理员,订单管理员,后台管理员 ,最后在做个格式化显示即可。。 这个自定义函数可以写在数据库中,使用sql语言;;;也可以写在程序中,程序中可能比较方便点。
json_ycp 2016-05-01
  • 打赏
  • 举报
回复
这种情况下,如果不想在数据库表层面做文章,那最好就是在程序中做处理,进行一次封装
  • 打赏
  • 举报
回复
如果有列表展示的需求,最好还是做个中间表吧……这样解析效率会很低的。 如果不需要列表展示,更简单的做法是放到程序里面查询第二次……咳咳。 如果是限定必须在这种情况下给出答案,那么……自便。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧