Mysql不按所需顺序执行select语句

时间:2013-06-30 17:08:04

标签: php mysql

我有这个数组:

$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(它代表一个顶级列表)。这可能吗?

2 个答案:

答案 0 :(得分: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 . ")"); 

答案 1 :(得分:1)

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

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

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