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.
谢谢,
要按数组中的顺序对结果进行排序,可以执行以下操作:
$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)
正如我在 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