Mysql没有';t按所需顺序执行select语句


Mysql doesn't execute select statement in the desired order

我有这个数组:

$keys = Array(79, 68, 80, 78, 71, 69, 77, 82, 83, 70, 76, 74, 75)

然后,我使用以下数组在数据库中进行查询:

$dbh = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$stmt = $dbh->prepare("SELECT * 
    FROM table 
    WHERE id IN (" . implode(',', array_map('intval', $keys)) . ")"); 
$stmt->execute();

但呼应了结果,就像。。。

while( $row = $stmt->fetch() ) {
    echo $row['id'] . '<br />';
}

给我:

69
70
71
74
75
76
77
78
79
80
81
82
83

也就是说,结果按升序排序。但我需要像原始数组$keys一样对结果进行排序(它表示一个顶部列表)。这可能吗?

使用IN不会对结果进行排序。它只选择与查询匹配的记录。如果希望结果有序,则需要在查询中添加ORDER BY FIELD()子句。

$keyString = implode(',', array_map('intval', $keys));
$stmt = $dbh->prepare("SELECT * 
    FROM table 
    WHERE id IN (" . $keyString  . ")
    ORDER BY FIELD(id, " . $keyString . ")"); 

您必须为查询定义自定义排序

 $orderstr="ORDER BY CASE id ";
    for($i=0;$i<sizeof($keys);$i++)
    {$orderstr.="WHEN ".$keys[$i]. "Then".$i. "'n";}
    $orederstr.="END";

然后您可以在查询中使用$orderstr来订购