Mysql Codeigniter Active Record - 如何进行where_in查询并返回正确的结果顺序?

Ant*_*ony 5 php mysql search activerecord codeigniter

我有一组以特定顺序传递的ID,需要保留.我从几个左连接查询与每个ID相关的数据.从搜索中返回ID,因此必须保留顺序以使结果有效(否则会使搜索变得毫无意义).

我的代码看起来像;

$this->db->where_in('id', $array_of_ordered_ids);
Run Code Online (Sandbox Code Playgroud)

例如 -

$this->db->where_in('id', array(4,5,2,6));
Run Code Online (Sandbox Code Playgroud)

将按顺序返回结果2,4,5,6.

我希望它保留订单并返回结果4,5,2,6.

谢谢,

hak*_*kre 5

要按数组中的顺序对结果进行排序,可以执行以下操作:

$array_of_ordered_ids = array(4,5,2,6);
Run Code Online (Sandbox Code Playgroud)

正如您已经知道数字的顺序,您可以使用Mysql FIELD()Docs函数:

ORDER BY FIELD(id, 4, 5, 2, 6);
Run Code Online (Sandbox Code Playgroud)

要创建此类字符串,您可以使用implode文档:

$order = sprintf('FIELD(id, %s)', implode(', ', $array_of_ordered_ids));
Run Code Online (Sandbox Code Playgroud)

试试看:

$array_of_ordered_ids = array(4,5,2,6);
$this->db->where_in('id', $array_of_ordered_ids);
$order = sprintf('FIELD(id, %s)', implode(', ', $array_of_ordered_ids));
$this->db->order_by($order); 
Run Code Online (Sandbox Code Playgroud)


Kar*_*ler 5

正如我在 SO 上找到的所有答案,其中只是半正确,但都给出了很好的提示,我成功地实现了代码,以检索按给定数组中的顺序正确排序的行集。

生成这样的 sql:

SELECT * FROM (`product`) WHERE `id` IN (2, 34, 234) 
ORDER BY FIELD(`id`, 2, 34, 234)
Run Code Online (Sandbox Code Playgroud)

使用此代码,而 $ids 包含数组 (2, 34, 234)。

// select from ... 
$this->db->where_in('id',$ids);
$this->db->_protect_identifiers = FALSE; // stop CI adding backticks
$order = sprintf('FIELD(id, %s)', implode(', ', $ids));
$this->db->order_by($order);
$this->db->_protect_identifiers = TRUE; // switch on again for security reasons
// get...
Run Code Online (Sandbox Code Playgroud)

另请参见此处:http ://ellislab.com/forums/viewthread/137157/#1058666