mysql数据库中用数据库字段作为变量进行LIKE模糊查询!请看详细补充!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库中用数据库字段作为变量进行LIKE模糊查询!请看详细补充!相关的知识,希望对你有一定的参考价值。
如:我要查询tb_mgoodsmoretype中编号为10,121的数据,并根据其编号gmt_Id_i 在tb_mgoods 表中统计这个编号对应的数据条数 补充:goods_MoreType_v的数据格式为[10][12],或者[121][1789]
select gmt_Id_i ,gmt_Name_v,
(select count(*) from tb_mgoods where goods_MoreType_v like '%gmt_Id_i%') as counts
from tb_mgoodsmoretype where gmt_Id_i in(10,121)
哦上面的条件是这样的 like '%[gmt_Id_i]%' 因为goods_MoreType_v的格式是这样的 [10][121]
请看清问题我是要用LIKE,不是直接等于!因为goods_MoreType_v数据格式是 [10][121] 之类的,而我的gmt_Id_i数据是编号 10 等
【select gmt_Id_i ,gmt_Name_v,
(select count(*) from tb_mgoods where goods_MoreType_v=tb_mgoodsmoretype.gmt_Id_i) as counts
from tb_mgoodsmoretype where gmt_Id_i in(10,121) 】
( select count(*) from tb_mgoods where goods_MoreType_v like '%/[' + t.gmt_Id_i + '/]%' escape '/') as counts
from tb_mgoodsmoretype t where t.gmt_Id_i in(10,121)
注意: like '%某字符串%' 等效于 like '%'+'某字符串'+'%',由于gmt_Id_i是字段名称,故不能使用 like '%gmt_Id_i%' 必须使用 like '%' + gmt_Id_i + '%' ,另外由于你的goods_MoreType_v字段含有[],必须使用转义符,把[]转为字符串[],否则,sql会理解[]为通配符使用,还有 sql中转义符\ 解释为把该字符后的第一个字母转成普通的字符。 参考技术A select gmt_Id_i ,gmt_Name_v,
(select count(*) from tb_mgoods where goods_MoreType_v=tb_mgoodsmoretype.gmt_Id_i) as counts
from tb_mgoodsmoretype where gmt_Id_i in(10,121) 参考技术B select gmt_Id_i ,gmt_Name_v,
(select count(*) from tb_mgoods where goods_MoreType_v=tb_mgoodsmoretype.gmt_Id_i) as counts
from tb_mgoodsmoretype where gmt_Id_i in(10,121)本回答被提问者采纳
如何在 MySQL LIKE 子句中使用用户变量?
【中文标题】如何在 MySQL LIKE 子句中使用用户变量?【英文标题】:How to use an user variables in MySQL LIKE clause? 【发布时间】:2012-01-22 04:15:39 【问题描述】:我正在尝试设置一些简单的 SQL 脚本来帮助进行一些短期数据库管理。 因此,我正在设置变量以尝试更轻松地重用这些脚本。
我遇到的问题是 LIKE 子句。
SET @email = 'test@test.com';
SELECT email from `user` WHERE email LIKE '%@email%';
所以我想让它根据变量中的电子邮件 SET 查找结果。如果我在 LIKE 子句中手动输入电子邮件,则查询有效。
如何让 LIKE 子句与用户变量一起使用?
更新: @dems 的答案适用于这个简单的案例,但我在处理更复杂的查询时遇到了麻烦。
SET @email = 'test@test.com';
SELECT project.projectno, project.projectname, login.username,
CONCAT(login.firstname, ' ', login.lastname), projectuser.title
FROM projectuser
INNER JOIN login ON projectuser.uid = login.uid
LEFT JOIN project ON projectuser.pid = project.pid
WHERE login.username LIKE CONCAT ('%', @email, '%')
给我错误“FUNCTION mydb.CONCAT 不存在”
查询在没有 CONCAT() 的情况下工作:
SET @email = 'test@test.com';
SELECT project.projectno, project.projectname, login.username,
CONCAT(login.firstname, ' ', login.lastname), projectuser.title
FROM projectuser
INNER JOIN login ON projectuser.uid = login.uid
LEFT JOIN project ON projectuser.pid = project.pid
WHERE login.username LIKE @email
【问题讨论】:
删除CONCAT
和大括号(
之间的空格字符。应该是CONCAT(...
,而不是CONCAT (
@a1ex07 是的,删除该空间修复了它。谢谢。
我知道我们在这里不教语法,但我肯定不会是唯一一个被问题标题中的错误困扰的人,“如何使用用户变量在 MySQL LIKE 子句中?”
@qualebs 在我编辑问题时发生。应该是迟到了。我建议您继续并发布对问题的编辑。
【参考方案1】:
SET @email = 'test@test.com';
SELECT email from `user` WHERE email LIKE CONCAT('%', @email, '%');
【讨论】:
这适用于这种更简单的情况。我扩展了我的查询以包含一些 JOINS,现在它给了我一个错误,告诉我“FUNCTION mydb.CONCAT 不存在”。我还发现 (SET @email = '%test@test.com%';) 允许我跳过 CONCAT,但我不喜欢将搜索语法与数据配对。 @Chris - 您需要将您的新查询作为一个整体展示,因为其中一定有一些新错误。 CONCAT() 只是将多个字符串连接在一起,在我的示例中使用一个变量作为字符串之一。 是的,我用更复杂的查询更新了原始问题。 @Chris - 不知道,它应该可以工作。拼命抓住野外将是删除CONCAT
和(
之间的空格
智能解决方案,谢谢 :)【参考方案2】:
无需 concat() 即可工作:
LIKE '%$var%'
(Mysql 5.+)
【讨论】:
这应该是 php 辅助答案吗? 那是受SQL注入的影响。【参考方案3】:你可能有错误
Error Code: 1267. Illegal mix of collations for operation 'like' 0.016 sec
在这种情况下,您需要指定与您的表相同的排序规则:
SET @email = 'test@test.com' COLLATE utf8_unicode_ci;
【讨论】:
【参考方案4】:我在使用 LIKE 语句之前使用 CONCAT 函数解决了:
SET @email = 'test@test.com';
set @email = CONCAT('%',@email,'%');
SELECT email from `user` WHERE email LIKE @email;
对我来说很好用
【讨论】:
【参考方案5】:BEGIN
SET @emailid = CONCAT('%', 'email@email.com' ,'%');
SET @t1 =CONCAT('SELECT * FROM user WHERE email LIKE ''', @emailid, '''');
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
【讨论】:
【参考方案6】:无需CONCAT,只需使用'%'+变量+'%':
SET @email = 'test@test.com';
SELECT email from `user` WHERE email LIKE '%' + @email + '%';
【讨论】:
它在 MSSQL 中工作,对于 MYSQL,MatBailie 的答案应该工作。【参考方案7】:22 年 1 月,我在使 LIKE 命令工作时遇到问题。我通过回显变量值和我的 SQL 语句发现,quote 函数在变量周围放置了刻度线。获取业务类型的代码:
isset($_POST['button']) ? $businesstype = get_post($pdo, 'button'):
$businesstype = get_post($pdo, 'businesstype');
function get_post($pdo, $var)
return htmlentities($pdo->quote($_POST[$var]));
$businesstype 的回声:“理发师”
SQL 的回显:选择 BusinessName、MemberNum、Street、City FROM member WHERE verify = TRUE AND businesstype LIKE 'Barber' Order by featurelevel desc、membershipdate desc、businessname
由于单引号已经在搜索值周围,要使用 LIKE,我必须在第一个刻度标记之后和最后一个标记之前获取 %。 我使用了字符串替换函数和 concat 运算符的组合: 将原始单引号替换为空,并在搜索值周围连接 '% 和 %'。
$businesstype ="'%" . str_ireplace("'","",$businesstype) . "%'";
。 为我工作。我希望它对某人有所帮助。如果我以某种方式撤消 SQL 注入保护措施,请告诉我。
【讨论】:
请不要破坏您自己的帖子。如果您想删除您的答案,只需删除您的答案即可。【参考方案8】:使用与 oracle 相同的语法似乎可以工作:
SELECT email from user WHERE email LIKE '%' || @email || '%';
【讨论】:
您的解决方案不会仅过滤包含“电子邮件”的字段。它实际上返回所有字段,因为您的语法意味着“电子邮件”或其他任何内容 这基本上返回每一行。以上是关于mysql数据库中用数据库字段作为变量进行LIKE模糊查询!请看详细补充!的主要内容,如果未能解决你的问题,请参考以下文章