怎么实现拼接字符串的不定条件模糊查询

ye63ye 2018-08-06 02:12:03

要求:对ren表查询带有”球“字的
select * from ren
where Id in (select Id from tiyu where name like '%球%')
(大概意思是这样的,这是精确查询,我要的是模糊查询--------希望给个解决方案,或者更好的数据库设计方案)
...全文
381 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-08-06
  • 打赏
  • 举报
回复
select * from ren 
where exists (
select 1
from tiyu
where tiyu.`name` like '%球%'
and instr(concat(',', ren.NameIdAdd,','), concat(',',tiyu.Id,','))>0
);


稍改一下, instr 不需要 % 。
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
可以
牛!
我结帖了
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
你的意思是 我应该在另外做一个表来存储 是这样的吗

吉普赛的歌 版主 2018-08-06
  • 打赏
  • 举报
回复
drop table if exists `ren`;
drop table if exists `tiyu`;
CREATE TABLE `ren` (
`Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`NameIdAdd` VARCHAR(45) NULL,
PRIMARY KEY (`Id`),
UNIQUE INDEX `idRen_UNIQUE` (`Id` ASC));
--
CREATE TABLE `tiyu` (
`Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(45) NULL,
PRIMARY KEY (`Id`),
UNIQUE INDEX `Id_UNIQUE` (`Id` ASC));
--
INSERT INTO `ren` (`NameIdAdd`) VALUES ('1,3,7,9');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('1,5,8');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('1,10');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('2,5,8');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('1,2,3,9');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('2,4,7,9');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('1,6,8,10');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('3,5,9');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('3,5,7,10');
INSERT INTO `ren` (`NameIdAdd`) VALUES ('4,8,10');
--
INSERT INTO `tiyu` (`Name`) VALUES ('足球');
INSERT INTO `tiyu` (`Name`) VALUES ('篮球');
INSERT INTO `tiyu` (`Name`) VALUES ('引体向上');
INSERT INTO `tiyu` (`Name`) VALUES ('羽毛球');
INSERT INTO `tiyu` (`Name`) VALUES ('1000米');
INSERT INTO `tiyu` (`Name`) VALUES ('100米');
INSERT INTO `tiyu` (`Name`) VALUES ('仰卧起坐');
INSERT INTO `tiyu` (`Name`) VALUES ('乒乓球');
INSERT INTO `tiyu` (`Name`) VALUES ('体前屈');
INSERT INTO `tiyu` (`Name`) VALUES ('排球');

-- 以上为测试表和测试数据

select * from ren
where exists (
select 1
from tiyu
where tiyu.`name` like '%球%'
and instr(concat('%,', ren.NameIdAdd,',%'), concat(',',tiyu.Id,','))>0
);

ye63ye 2018-08-06
  • 打赏
  • 举报
回复
一对多 是的 但是如果是一对40多条 就显得太累赘,而且我用的表是不止这两个字段的,拆了就数据重复太多了
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
引用 12 楼 ye63ye 的回复:
多选的存在,表拆不了


这个什么意思?不是一对多吗?为啥拆不了?
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
id拼接就查不了了

ye63ye 2018-08-06
  • 打赏
  • 举报
回复
只是我把 xiangmu字段又拆了一个表,因为xiangmu字段要存储文字数据太大,我就改成id拼接了
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
多选的存在,表拆不了
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
没太明白,如果是上边说的那种直接 where xiangmu like '%关键字%' 就行了
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
其实我要的是这样的要求。

id name xiangmu
1 张三 足球,篮球,1000米
2 李四 乒乓球,排球
3 王五 1000米,引体向上
4 赵六 引体向上,体前屈

查出xiangmu字段中有”球“字的
结果
id name xiangmu
1 张三 足球,篮球,1000米
2 李四 乒乓球,排球


查出xiangmu字段中有”1000“字的
结果
id name xiangmu
1 张三 足球,篮球,1000米
3 王五 1000米,引体向上




查出xiangmu字段中有”引“字的
结果
id name xiangmu
3 王五 1000米,引体向上
4 赵六 引体向上,体前屈
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
把现在的表拆了
ren
id
1
2
3

renreltiyu
renid tiyuid
1 1
1 5
1 8
1 11
2 2

tiyu
id name
1 篮球

SELECT DISTINCT
ren.*
FROM
ren
JOIN
renreltiyu
ON ren.id = renreltiyu.renid
JOIN
tiyu
ON tiyuid = tiyu.id
WHERE
tiyu.name LIKE '%球%';
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
能再详细点吗,不是很懂
二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
把ren表表结构改改,把后边那些ids再建一个一对多的表
renid tiyuid
1 1
1 5
1 8
1 11
2 2
........
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
这是意思,就是写不出来
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
但是是执行不不出来的
用的NameIdAdd是拼接语句

ye63ye 2018-08-06
  • 打赏
  • 举报
回复
比如 查询“球”这个字 在tiyu表查询返回id: 1 2 4 8 10 然后分别根据id去查询ren表的NameIdAdd
例如将id=1 去查询ren表的NameIdAdd
返回
Id NameIdAdd
1 省略
2 省略
3 省略
5 省略
7 省略

依次 2 4 8 10
然后得出的总表

吉普赛的歌 版主 2018-08-06
  • 打赏
  • 举报
回复
你原来写的本来就是模糊啊,
select * from ren 
where Id in (select Id from tiyu where name like '%球%')


你期望的结果是什么样的?
ye63ye 2018-08-06
  • 打赏
  • 举报
回复
CREATE TABLE `ceshi`.`ren` (
`Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`NameIdAdd` VARCHAR(45) NULL,
PRIMARY KEY (`Id`),
UNIQUE INDEX `idRen_UNIQUE` (`Id` ASC) VISIBLE);

CREATE TABLE `ceshi`.`tiyu` (
`Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(45) NULL,
PRIMARY KEY (`Id`),
UNIQUE INDEX `Id_UNIQUE` (`Id` ASC) VISIBLE);

INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('1,3,7,9');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('1,5,8');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('1,10');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('2,5,8');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('1,2,3,9');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('2,4,7,9');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('1,6,8,10');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('3,5,9');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('3,5,7,10');
INSERT INTO `ceshi`.`ren` (`NameIdAdd`) VALUES ('4,8,10');


INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('足球');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('篮球');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('引体向上');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('羽毛球');
INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('1000米');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('100米');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('仰卧起坐');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('乒乓球');

INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('体前屈');
INSERT INTO `ceshi`.`tiyu` (`Name`) VALUES ('排球');



二月十六 版主 2018-08-06
  • 打赏
  • 举报
回复
模糊查询什么样的?怎么个模糊法?
加载更多回复(1)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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