使用Insert语句的PHP搜索查询

时间:2016-03-12 11:08:51

标签: php mysql full-text-search

我正在使用PHP / MySQL进行产品搜索。当用户搜索产品时(可以搜索多个产品,它是多选的下拉列表),它应该从表A中获取数据并在表B中获取插入。用户可以搜索多个产品。我在查询中有问题。它很慢,并没有得到所有与产品搜索相关的产品。有时它只是采取第一个搜索标准。

iam使用的查询如下:

$arr = explode(",",$values["prod_cat"]);

for ($i=0;$i<count($arr);$i++)
{
  $strSQLInsert = "INSERT INTO TABLE B (sup_id, sup_name, sup_product, sup_contactperson, 
                   sup_contactperson_email, tender_id) 

                   (SELECT sup_id, sup_name, sup_prod_name, sup_contactperson, sup_email, 
                   ".$values["tender_id"]." FROM TABLE A WHERE sup_prod_name IN 
                   ('".$arr[$i]."')  GROUP BY sup_name)";

我犯了什么错误吗?

2 个答案:

答案 0 :(得分:1)

您在$values['prod_cat']中展开$arr,然后对每个IN值执行$arr条件的多个查询进行迭代。

IN clausole存在多个值(对于单个值,只使用WHERE sup_prod_name = ''),因此您可以避免for()循环,并且只执行一个以这种方式转换$values['prod_cat']的查询:

$prod_cat_names = "'" . str_replace( ",", "','", $values["prod_cat"] ) . "'";
/*
    Example:    cat1,cat2,cat3    =>    'cat1','cat2','cat3'
*/

并使用此查询没有for()循环

"
INSERT INTO TABLE B 
            (sup_id, sup_name, sup_product, sup_contactperson, sup_contactperson_email, tender_id) 

            (
            SELECT sup_id, sup_name, sup_prod_name, sup_contactperson, sup_email, ".$values["tender_id"]." 
              FROM TABLE A 
             WHERE sup_prod_name IN ( {$prod_cat_names} )
             GROUP BY sup_name
            )
"

另外,我不知道您的确切表结构,但如果表A sup_idsup_name的唯一ID,请考虑使用{{替换GROUP BY sup_name的可能性1}}。

使用此代码,您的插入语句将更快。

关于从查询中检索行,您说:“它没有获得与产品搜索相关的所有产品”:我不知道您使用了什么,因为根据我的经验GROUP BY sup_id语句返回< strong>没有行。

如果您想要以最佳性能执行select-&gt; insert-&gt;检索,则必须使用stored procedure call,否则您必须执行两个查询,一个用于INSERT,一个用于SELECT

INSERT

请仔细注意:以上代码仅供参考:使用此代码,所有值都作为文本字符串生成,因此您必须检查表B中的实际字段值是否与之兼容文本插入:否则,您必须检查每个字段值构建查询字符串。

我使用/* Select Query as SELECT from previous example: */ $selectQuery = " SELECT sup_id, sup_name, sup_prod_name, sup_contactperson, sup_email, ".$values["tender_id"]." FROM TABLE A WHERE sup_prod_name IN ( {$prod_cat_names} ) GROUP BY sup_name "; /* Perform the query: */ $result = $db->query( $selectQuery ); $result->setFetchMode( PDO::FETCH_ASSOC ); $insertQuery = array(); /* Process result and pre-fill Insert Query: */ while( $row = $result->fetch() ) { /* Put here your code to echo / process returned row... */ $insertQuery[] = "'" . implode( "', '",$row ) . "'"; } /* Format INSERT Query: */ $insertQuery = " INSERT INTO TABLE B (sup_id, sup_name, sup_product, sup_contactperson, sup_contactperson_email, tender_id) VALUES (" . implode( "), (", $insertQuery ) . ") "; /* Permorm INSERT Query: */ $db->query( $insertQuery ); 作为MySQL驱动程序。您可以使用首选的驱动程序命令替换PDO命令。

答案 1 :(得分:0)

搜索我会建议你使用Pdo或面向对象的Mysql而不是原始查询。除此之外,你可以简单地使用

"Select field_name1, field_name2 from table A where field_name like '%text%'";

一旦你得到循环而不是插入你的表b

"Insert into field_name1, field_name2 values(field_name1, field_name2);