通过它们的id从mysql中提取多行的最有效方法是什么?

Kal*_*vas 2 php mysql

我有一个典型的情况,我需要通过他们的ID从mysql中提取多行.我只知道两种方法如何做,但我想知道是否有更好的方法来做到这一点?如果没有,那么我自己的哪种方法最新/最快/更好?

我的第一种方法: (~0.0003030)

$ids = array(3, 4, 6, 11);

foreach ($ids as $id) {
    $task = $DB->query_first("SELECT * FROM tasks WHERE `id` = '$id'");
    DoSomethingWithTheTask($task);
}
Run Code Online (Sandbox Code Playgroud)

我的 第二种方法:(~0.0001040)

$ids = array(3, 4, 6, 11);

foreach ($ids as $id) {
    $wheres[] = '`id` = \'' . $id . '\'';
}

$tasks = $DB->query("SELECT * FROM tasks WHERE " . implode(' OR ', $wheres));

while ($task = $DB->fetch_array($tasks)) {
    DoSomethingWithTheTask($task);
}
Run Code Online (Sandbox Code Playgroud)

我甚至考虑第二种方法的原因是因为它只使用了1x查询.但是,我坚信这两种方法都不整齐,需要进行优化.据我所知,你不能这样做一个查询:WHERE id = '2, 3, 4'.

You*_*nse 7

实际上,你可以.IN运营商做到了.

SELECT * FROM tasks WHERE `id` IN (2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

会做的伎俩.您可以使用IN运算符同时使用数值或字符串值

正如约翰以失败为榜样,这是一个正确的方法

$ids = array(3, 4, 6, 11);
$in  = implode(",",$ids);
$sql = "SELECT * FROM tasks WHERE `id` IN ($in)");
Run Code Online (Sandbox Code Playgroud)

为了频繁使用我会做一个占位符,以这种方式调用整个表达式

$ids  = array(3, 4, 6, 11);
$data = $db->getArr("SELECT * FROM tasks WHERE `id` IN (?a)",$ids);
Run Code Online (Sandbox Code Playgroud)

从评论中回答你的问题,这是我的db类的代码

function escapeString($value)
{
    return  "'".mysql_real_escape_string($value,$this->connect)."'";
}
function createIN($data)
{
    if (!is_array($data))
    {
        throw new E_DB_MySQL_parser("Value for ?a type placeholder should be array.");
    }
    if (!$data)
    {
        throw new E_DB_MySQL_parser("Empty array for ?a type placeholder.");
    }
    $query = $comma = '';
    foreach ($data as $key => $value)
    {
        $query .= $comma.$this->escapeString($value);
        $comma  = ",";
    }
    return $query;
}
Run Code Online (Sandbox Code Playgroud)

getArr()方法与此没有直接关系,因为它只负责结果类型.