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 t.gmt_Id_i ,t.gmt_Name_v,
( 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模糊查询!请看详细补充!的主要内容,如果未能解决你的问题,请参考以下文章

mysql怎么用like检索字段中带有数字的语句?

10like子句

mysql查询语句中like 的用法

python中的mysql数据库like模糊查询

mysql数据库多字段模糊查询语句怎么写

mysql 中用sql判断两个字段长度是不是相等