2013-06-30 50 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在查詢訂購