如何在MySQL中搜索多个完整和部分值?

时间:2012-08-22 07:53:31

标签: mysql search sql-like

我正在运行在Coldfusion8/MySQL 5.0.88数据库上运行的应用程序。

该应用程序有一个搜索表单,用户可以使用该表单搜索产品ID。

现在我的SQL语句如下所示:

  ...
  AND a.product_id LIKE <cfqueryparam value="%#form.s_product_id#%" cfsqltype="cf_sql_varchar">

用户通常会传递single idpartial id,因此我需要此功能才能同时使用:

   123456 (full id)
   123 (partial id)

但是,我还想让用户搜索多个ID。因此用户可以输入:

   12345,233345,78876

问题
我可以在提交表单之前清除空格,但是如何创建它以便我的MySQL搜索处理程序correclty将其标识为列表。如果我只使用IN代替LIKE,我会丢失partial_ID,不是吗?

3 个答案:

答案 0 :(得分:1)

我不是在进行coldfusion,但你需要在逗号中拆分ID列表并构建一个这样的查询:

... AND (a.product_id LIKE '%12345%' OR a.product_id LIKE '%123%' OR a.product_id LIKE '%78876%') ...

答案 1 :(得分:1)

因此,有效的ColdFusion解决方案可能是:

    <cfquery name="your_query_name" datasource="your_datasource">
    SELECT column1, column2
    FROM a
    WHERE condition=whatever
    <cfif listlen(form.s_product_id)>
       AND (1=0 /* always false; for SQL syntax only */
       <cfloop list="#form.s_product_id#" index="variables.s_product_id_ii">
         OR a.product_id LIKE <cfqueryparam value="%#variables.s_product_id_ii#%" cfsqltype="cf_sql_varchar" />
       </cfloop>)
    </cfif>
    </cfquery>

如果'a.product_id'是整数字段,请考虑将其强制转换为VARCHAR

    CAST(a.product_id AS VARCHAR(50)) LIKE <cfqueryparam...

所以这个查询不会在不同的,更严格的数据库上中断。 或者,由于您将form.s_product_id列表拆分为其组件整数,因此可以将cfqueryparam cfsqltype更改为“cf_sql_integer”。

答案 2 :(得分:1)

<?php
include('config.php');
if (!empty($_REQUEST['term'])) {

$term = mysql_real_escape_string($_REQUEST['term']);     

$sql ="Select product.id,costomer.name,costomer.mobile,product.cid,product.pname,product.model,product.date,product.harddisk,product.ram,product.damage,product.driver,product.status from product INNER JOIN costomer
ON costomer.cid=product.cid WHERE id LIKE '%".$term."%'
OR name LIKE '%".$term."%',
OR pname LIKE '%".$term."%',
OR model LIKE '%".$term."%',
OR statusLIKE '%".$term."%',";

$r_query = mysql_query($sql); 
?>

<?php
while ($row = mysql_fetch_array($r_query)){  


echo '<tr><td>' .$row['id'].'</td>';  
echo '<td>'.$row['name'].'</td>';
echo '<td>' .$row['pname'].'-'.$row['model'].'</td>';  
echo '<td>'.$row['mobile'].'</td>';
echo '<td>'.$row['status'].'</td>';


}  
echo '</tr>';
}

?>