如何在包含值列表的数据库字段中搜索值?

时间:2013-10-23 16:37:36

标签: mysql coldfusion coldfusion-10

我希望我能正确地提出这个问题。我正在使用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的所有公司。

我想做的是什么?感谢您提供的任何帮助。

2 个答案:

答案 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更快。

是的,将数据标准化!!