如何改进以下mySql查询以使用PDO准备的语句?

如何改进以下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

我有一个表“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和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')

这将在((4,'post'),(2,'file'),(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准备的声明中吗?如果下面的答案之一回答了您的问题,即本网站的工作方式,您会“接受”答案,更多信息:。但前提是你的问题真的得到了回答。如果不是,考虑在问题上增加更多的细节。如果下面的答案回答了你的问题,这个网站的工作方式,你会“接受”这个答案,更多的是:但前提是你的问题真的得到了回答。如果没有,考虑在问题中添加更多的细节。