【问题标题】:PHP Search query with Insert Statement带有插入语句的 PHP 搜索查询
【发布时间】:2016-03-12 11:08:51
【问题描述】:

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

我使用的查询如下:

$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)";

我有什么错误吗?

【问题讨论】:

  • 是否有特殊原因要从表 A 中插入表 B 产品?您将使用表 B 做什么?
  • 如果您希望表 B 是临时的,那么您可以使用“视图”。它会更好地执行代码。
  • @Fusion。这实际上是客户的要求。首先,他将搜索产品。结果(产品名称)应保存到另一个表B
  • @WisdmLabs。它不是临时表..它应该保存在实际表中..
  • 也许可以试试 SELECT INTO 语句。从表 A 中选择到表 B 中的 sub_prod_name。为什么在插入另一个表时需要 GROUP BY?也许这可能会导致延迟?

标签: php mysql full-text-search


【解决方案1】:

您将$values['prod_cat'] 分解为$arr,然后迭代它,对每个$arr 值使用IN 条件执行多个查询。

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 替换为 GROUP BY sup_id 的可能性。

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


关于从查询中检索行,您说:“它没有获取与产品搜索相关的所有产品”:我不知道您使用什么,因为根据我的经验 INSERT 语句返回 no rows

如果您想以最佳性能执行选择->插入->检索,则必须使用stored procedure call,否则您必须执行两个查询,一个用于SELECT,一个用于INSERT

/* 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 );

请注意:以上代码仅用于示例目的:使用此代码,所有值都转换为文本字符串,因此您必须检查表 B 中的真实字段值是否兼容文本插入:否则,您必须检查每个字段值构建查询字符串。

我使用PDO 作为 MySQL 驱动程序。您可以将 PDO 命令替换为您喜欢的驱动程序命令。

【讨论】:

  • 非常感谢。让我尝试执行此操作。真的很感激。
  • 我正在尝试使用单独的选择和插入语句进行查询。当我尝试这样做时,我遇到了一些错误。错误是“ Parse error: syntax error, unexpected '") ' (T_CONSTANT_ENCAPSED_STRING) in D:\xampp\htdocs\crm\include\rfq_events.php on line 298”。插入语句的 implode 函数中存在一些错误。我是试图解决它
  • 我猜是使用单引号或双引号的问题
  • 第 298 行是什么?
  • 第 298 行有以下内容....(" . implode( "), (", $insertQuery ) ")
【解决方案2】:

对于搜索,我建议您使用 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);

【讨论】:

  • 在这种情况下我将如何将它存储在数组中?
  • 用户也可以搜索多个产品。用户可以使用多选从下拉列表中选择产品...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
相关资源
最近更新 更多