gpt4 book ai didi

mysql - 如何将搜索字符串 Coldfusion-loop 转换为 MySQL 存储过程?

转载 作者:行者123 更新时间:2023-11-29 14:27:56 27 4
gpt4 key购买 nike

我继承了一个 Coldfusion8 网站,该网站正在使用一些搜索功能。

我正在尝试将标准化数据库查询存储到存储过程中。由于我是 Coldfusion 和 MySQL 的新手,我现在想知道是否可以在 MySQL 中执行此操作:

<cfquery datasource="db" name="find_cats">
SELECT wg.no, wg.type, wg.keywords, wg.lang
FROM cats AS wg
<cfloop list="searchForm.cats_search_string" delimiters=", " item="tag">
WHERE wg.keywords LIKE <cfqueryparam value='%#tag#%' cfsqltype='cf_sql_varchar'> AND
</cfloop>
wg.lang = <cfqueryparam value="#Session.lang#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfset cond_cats = "AND (1=2">
<cfoutput query="find_cats">
<!--- check if found category belongs to either AAA or BBB classifcation --->
<cfif wg.type is "AAA">
<cfset cond_cats = cond_cats & " OR categoryID1 = #wg.no#">
</cfif>
<cfif wg.typ is "BBB">
<cfset cond_cats = cond_cats & " OR categoryID2 = #wg.no#">
</cfif>
</cfoutput>
<cfset cond_cats = cond_cats & ")">

搜索可以基于关键字或索引(AAA、BBB)。我仍在尝试了解发生了什么,但到目前为止我认为如果用户输入如下字符串:

 string1, string2, string3 string4

第一部分循环遍历四个字符串(分隔符逗号和空格)并在数据库中查询匹配的关键字。然后,它创建一个新的 cond_cats 变量,在实际搜索发生时使用该变量。我猜它会用匹配的类别替换搜索字符串,但我不确定这里,因为结果将是

AND (1=2 OR category1 = 12345 OR category2 = 88888 )

附加到实际搜索查询中。

我的问题:
MySQL 有没有办法分割用户输入的搜索字符串,以便我能够运行循环?第二部分应该是存储过程的外参数,不是吗?如果在每次搜索之前运行它,它应该是一个存储过程还是应该继续使用数据库查询?

感谢您的一些意见!

最佳答案

根据您的描述,我没有看到将其包装在存储过程/函数中有多大好处。数据库并未真正针对字符串操作进行优化。虽然循环是可能的,但等效的 SQL 代码通常远没有那么优雅。另外,它可能需要使用动态 sql(或临时表来安全地执行此操作)。

但是,查看您的代码,我相信您可以通过使用单个 IN (....) 来完全消除第二个 cfloop子句而不是构造一系列 OR 条件。 (两者是等价的。)

只需修改第一个查询即可检索所需类型的类别,即“AAA”和“BBB”。

<cfquery datasource="db" name="find_cats">
SELECT wg.no
FROM cats AS wg
WHERE wg.lang = <cfqueryparam value="#Session.lang#" cfsqltype="cf_sql_varchar">
AND wg.type IN ('AAA', 'BBB')
AND ( 1 = 2
<cfloop list="#searchForm.cats_search_string#" delimiters=", " item="tag">
OR wg.keywords LIKE <cfqueryparam value='%#tag#%' cfsqltype="cf_sql_varchar">
</cfloop>
)
</cfquery>

然后使用 ValueList将结果输入到第二个查询中。您甚至可以将两个查询合并为一个。但这完全取决于您的搜索查询的复杂性。

WHERE categoryID1 IN 
(
<cfqueryparam value="#valueList(find_cats.no)#" list="true" ... >
)
<小时/>

编辑:我认为您仍然可以使用 valueList。只需将 CASE 语句添加到第一个查询,将匹配值分为两列:

SELECT  wg.no
, CASE WHEN wg.type = 'AAA' THEN wg.no ELSE NULL END AS ID1Values
, CASE WHEN wg.type = 'BBB' THEN wg.no ELSE NULL END AS ID2Values
...

然后生成每列中的值的列表:

     <cfset firstList  = valueList(find_cats.ID1Values)>
<cfset secondList = valueList(find_cats.ID2Values)>

最后在您的搜索查询中使用这些列表。

   WHERE 1 = 2

<cfif listLen(firstList)>
OR categoryID1 IN ( <cfqueryparam value="#firstList#" list="true" cfsqltype="cf_sql_integer"> )
</cfif>

<cfif listLen(secondList)>
OR categoryID2 IN ( <cfqueryparam value="#secondList#" list="true" cfsqltype="cf_sql_integer"> )
</cfif>

关于mysql - 如何将搜索字符串 Coldfusion-loop 转换为 MySQL 存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10581262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com