SELECT usertName,place from user WHERE placeId=123
上面这条sql语句的结果如下: usertName place
宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣 水泊梁山----------------我想实现下面的结果,请问,该如何写select语句呢?placeId place usertName123 水泊梁山 宋江
123 水泊梁山 卢俊义
123 水泊梁山 吴用
123 水泊梁山 公孙胜
123 水泊梁山 关胜
123 水泊梁山 林冲
123 水泊梁山 秦明
123 水泊梁山 呼延灼
123 水泊梁山 花荣
上面这条sql语句的结果如下: usertName place
宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣 水泊梁山----------------我想实现下面的结果,请问,该如何写select语句呢?placeId place usertName123 水泊梁山 宋江
123 水泊梁山 卢俊义
123 水泊梁山 吴用
123 水泊梁山 公孙胜
123 水泊梁山 关胜
123 水泊梁山 林冲
123 水泊梁山 秦明
123 水泊梁山 呼延灼
123 水泊梁山 花荣
宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣 水泊梁山这个 要拆分usertName,以逗号为分隔符
create function t_split(@c varchar(2000),@split varchar(2))
returns @t table(col varchar(200))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = replace(@c,substring(@c,1,charindex(@split,@c))
end
insert @t(col) values (@c)
return
end
end
SELECT *,
MID(MID(a1,id),2,LOCATE(',',MID(a1,id),2)-2) AS a3
FROM (
SELECT CONCAT(',','宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣',',') AS a1, '水泊梁山' AS a2) a3
LEFT JOIN lsb1 b ON LENGTH(a1)>=b.id
WHERE MID(a1,b.id,1)=',' AND MID(MID(a1,id),2,LOCATE(',',MID(a1,id),2)-2)<>' '将'宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣'、'水泊梁山'->你的字段名
或者考虑你的表结构设计,placeId place usertName 这种格式比较规范,你现在的设计连数据库的第一范式都无法满足。
+----------------------------------------------------+----------+---------+
| usertName | place | placeId |
+----------------------------------------------------+----------+---------+
| 宋江,卢俊义,吴用,公孙胜,关胜,林冲,秦明,呼延灼,花荣 | 水泊梁山 | 123 |
+----------------------------------------------------+----------+---------+
1 row in set (0.00 sec)mysql> select * from seq_aux;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
+----+
20 rows in set (0.00 sec)mysql> select placeId,place,
-> SUBSTRING_INDEX(SUBSTRING_INDEX(usertName,',',seq_aux.id),',',-1) as usertName
-> from user,seq_aux
-> where length(usertName)-length(replace(usertName,',',''))>=seq_aux.id;
+---------+----------+-----------+
| placeId | place | usertName |
+---------+----------+-----------+
| 123 | 水泊梁山 | 宋江 |
| 123 | 水泊梁山 | 卢俊义 |
| 123 | 水泊梁山 | 吴用 |
| 123 | 水泊梁山 | 公孙胜 |
| 123 | 水泊梁山 | 关胜 |
| 123 | 水泊梁山 | 林冲 |
| 123 | 水泊梁山 | 秦明 |
| 123 | 水泊梁山 | 呼延灼 |
+---------+----------+-----------+
8 rows in set (0.04 sec)mysql>
谢谢ACMAIN_CHM,但是,你是借助另外一个表seq_aux的id字段来实现的,seq_aux表中有多少条记录,就能显示user表中username字段中多少个名字。你能有不借助另外一个表实现吗?
呵呵,谢谢你。我想用powerIsAll这个美眉的function,但是有语法错误,你可以帮我改一下吗?分都给你吧,因为要在程序代码中调用,谢谢了!