我希望我能正确地提出这个问题。我正在使用ColdFusion 10并且有一个名为companies
的mySQL表。在表中有一个名为stateList
的字段。它包含逗号分隔的state_IDs列表,其中公司有商店。
我有一个搜索表单供用户选择状态以查找处于该状态的公司。我需要将form.state_ID
传递给搜索查询,以查看companies.stateList
是否包含form.state_ID
。
我尝试的唯一代码返回了任何结果,并且它们并非都是正确的结果,是
<cfquery name="searchCompanies" datasource="#businessDSN#">
SELECT company_id, company_name, stateList
FROM companies
WHERE stateList LIKE "%#form.state_ID#"
</cfquery>
如果我搜索了亚利桑那州,state_ID
4,则上述查询返回了stateList
中包含4,14,24,34和44的所有公司。
我想做的是什么?感谢您提供的任何帮助。
答案 0 :(得分:5)
...有一个名为stateList的字段。它包含逗号分隔的state_IDs列表...
天啊,为什么?如果可以,请立即将其更改为正确的关系表!
但暂时......
<cfquery name="searchCompanies" datasource="#businessDSN#">
SELECT company_id, company_name, stateList
FROM companies
WHERE CONCAT(',', stateList, ',')
LIKE
CONCAT('%,', <cfqueryparam value="#form.state_ID#" cfsqltype="CF_SQL_VARCHAR">, ',%')
</cfquery>
并且请使用<cfqueryparam>
而不是将unchecked user input放入SQL字符串中。
答案 1 :(得分:2)
如果您使用的是MySQL,可以使用FIND_IN_SET ...赞:
<cfquery name="searchCompanies" datasource="#businessDSN#">
SELECT company_id, company_name, stateList
FROM companies
WHERE FIND_IN_SET(<cfqueryparam value="#form.state_ID#" cfsqltype="CF_SQL_VARCHAR">,stateList)
</cfquery>
我不确定查询是否比Tomalak更快。
是的,将数据标准化!!