如何改进以下mySql查询以使用PDO准备的语句?
我有一个表“my_table”,其中包含以下字段如何改进以下mySql查询以使用PDO准备的语句?,mysql,sql,pdo,Mysql,Sql,Pdo,我有一个表“my_table”,其中包含以下字段 object_id: number | object_type: varchar | object_value: text 样本数据: 4 | post | Lorem ipsum 2 | file | Lorem ipsum 3 | post | Lorem ipsum 2 | page | Lorem ipsum 1 | post | Lorem ipsum 2 | file | Lorem ipsum 我有一个包含object_id和o
object_id: number | object_type: varchar | object_value: text
样本数据:
4 | post | Lorem ipsum
2 | file | Lorem ipsum
3 | post | Lorem ipsum
2 | page | Lorem ipsum
1 | post | Lorem ipsum
2 | file | Lorem ipsum
我有一个包含object_id和object_类型的对象数组。有没有更好的方法来执行以下查询,如果有,它在PDO准备的语句中会是什么样子
SELECT *
FROM my_table
WHERE (object_id = 4 AND object_type = 'post')
OR (object_id = 2 AND object_type = 'file')
OR (object_id = 3 AND object_type = 'post');
感谢所有响应者这里有一个选项:
select * from mytable
where (object_id, object_type) in (
select 4, 'post' union all
select 2, 'file' union all
select 3, 'post')
select * from mytable
where (object_id, object_type) in (
select 4, 'post' union all
select 2, 'file' union all
select 3, 'post')
(对象id,对象类型)
如果列表中的元组数量不同,则需要动态构造提供给PDO的查询(和参数列表)。这将在((4,'post')、(2,'file')、(3,'post'))中工作(object\u id,object\u type)
如果
列表中的元组数量不同,则需要动态构造给PDO的查询(和参数列表)。非常感谢上面的人给出的答案。您帮助我提出了以下动态PDO准备的声明
// THIS IS MY ARRAY OF OBJECTS
$data[0]['object_id']=4;
$data[0]['object_type']='post';
$data[1]['object_id']=2;
$data[1]['object_type']='file';
// CREATING A DYNAMIC PDO PREPARED STATEMENT
$sql="SELECT *
FROM mytable
WHERE (object_id, object_type) IN (";
$i=0;
foreach($data as $datum){
if($i!=0){
$sql.=",";
}
$i=1;
$sql.="(?,?)";
}
$sql.=")";
$stmt=$connection->prepare($sql);
$execute_data=array();
foreach($data as $datum){
array_push($execute_data,$datum['object_id']);
array_push($execute_data,$datum['object_type']);
}
$stmt->execute($execute_data);
非常感谢上面这些人的回答。您帮助我提出了以下动态PDO准备的声明
// THIS IS MY ARRAY OF OBJECTS
$data[0]['object_id']=4;
$data[0]['object_type']='post';
$data[1]['object_id']=2;
$data[1]['object_type']='file';
// CREATING A DYNAMIC PDO PREPARED STATEMENT
$sql="SELECT *
FROM mytable
WHERE (object_id, object_type) IN (";
$i=0;
foreach($data as $datum){
if($i!=0){
$sql.=",";
}
$i=1;
$sql.="(?,?)";
}
$sql.=")";
$stmt=$connection->prepare($sql);
$execute_data=array();
foreach($data as $datum){
array_push($execute_data,$datum['object_id']);
array_push($execute_data,$datum['object_type']);
}
$stmt->execute($execute_data);
这似乎更多cumbersome@FirstOne--说得好,我只是想展示另一种解决方案<代码>动态sql
可能是该场景的唯一方法。@sgedes我决定删除我的注释并首先得到op的确认;)。。是的,op最终可能要做的就是动态查询tanks@sgedes,我喜欢第二个查询使用IN的例子,但是有可能把它添加到一个准备好的语句中吗?@sgedes你实际上可以使用准备好的语句。例如,在pdo中,您创建了一个查询,其中一堆?
作为占位符,并在execute
方法中将值作为数组传递。看一看上面的例子#3。根据对象的数量创建带有占位符的动态查询,并将值传递给execute
方法cumbersome@FirstOne--说得好,我只是想展示另一种解决方案<代码>动态sql可能是该场景的唯一方法。@sgedes我决定删除我的注释并首先得到op的确认;)。。是的,op最终可能要做的就是动态查询tanks@sgedes,我喜欢第二个查询使用IN的例子,但是有可能把它添加到一个准备好的语句中吗?@sgedes你实际上可以使用准备好的语句。例如,在pdo中,您创建了一个查询,其中一堆?
作为占位符,并在execute
方法中将值作为数组传递。看一看上面的例子#3。根据对象的数量创建带有占位符的动态查询,并将值传递给execute
方法。是一个使用这种语法的sqlfiddle。感谢Uuerdo和@FrankerZ,对于我的查询来说,这似乎是一个更干净的解决方案。。。但是,有没有可能将其添加到PDO准备的声明中?是一个使用这种语法的sqlfiddle。感谢Uuerdo和@FrankerZ,对于我的查询来说,这似乎是一个更干净的解决方案。。。但有可能将其添加到PDO准备的声明中吗?如果下面的答案之一回答了您的问题,即本网站的工作方式,您会“接受”答案,更多信息:。但前提是你的问题真的得到了回答。如果不是,考虑在问题上增加更多的细节。如果下面的答案回答了你的问题,这个网站的工作方式,你会“接受”这个答案,更多的是:但前提是你的问题真的得到了回答。如果没有,考虑在问题中添加更多的细节。