我正在使用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)";
我犯了什么错误吗?
答案 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_id
是sup_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);