2013-06-30 30 views
1

我有此数组:MySQL不期望的顺序执行select语句

$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(); 

但呼应出来的结果:

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

然后我用这个数组进行查询我的数据库像...

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

...给我:

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

即,结果按升序排序。但我需要结果像原始数组$ key(它代表顶部列表)排序。这可能吗?

回答

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 . ")"); 
+0

他要求他们不要进行排序,留在原数组的顺序。 –

+0

@JohnVanDeWeghe准确地说,按字段使用顺序将做到这一点。 – datasage

+0

哦,我误解了你原来的答案,我也不了解FIELD(),+1 –

1

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

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

那么你可以使用$orderstr在查询订购