1

我有这个数组:

$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 一样对结果进行排序(它代表一个顶级列表)。这可能吗?

4

2 回答 2

4

使用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 . ")"); 
于 2013-06-30T17:12:18.817 回答
1

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

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

那么您可以$orderstr在查询中使用来订购

于 2013-06-30T17:18:51.187 回答