我有一组以特定顺序传递的ID,需要保留。 我从几个左连接查询与每个ID相关的数据。 从搜索中返回ID,因此必须保留顺序以使结果有效(否则会使搜索变得毫无意义)。
我的代码看起来像;
$this->db->where_in('id', $array_of_ordered_ids);
例如 -
$this->db->where_in('id', array(4,5,2,6));
将按顺序2,4,5,6返回结果。
我希望它保留订单并返回结果4,5,2,6。
谢谢,
答案 0 :(得分:5)
要按数组中的顺序对结果进行排序,您可以执行以下操作:
$array_of_ordered_ids = array(4,5,2,6);
正如您已经知道数字的顺序,您可以使用Mysql FIELD()
Docs函数:
ORDER BY FIELD(id, 4, 5, 2, 6);
要创建此类字符串,您可以使用implode
Docs:
$order = sprintf('FIELD(id, %s)', implode(', ', $array_of_ordered_ids));
试一试:
$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);
答案 1 :(得分:4)
正如我在SO上找到的所有答案一样,只是半正确但所有提供了良好的提示我成功实现了代码,以检索由给定数组中的顺序排序正确的行集。
生成这样的sql:
SELECT * FROM (`product`) WHERE `id` IN (2, 34, 234)
ORDER BY FIELD(`id`, 2, 34, 234)
使用此代码,而$ 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...
答案 2 :(得分:0)
感谢最大的解决方案。
$orde_num_string = implode(",",$order_num);
$this->db->where_in("cir_order.order_num",$order_num);
$this->db->_protect_identifiers = FALSE;
$this ->db->order_by("FIELD(cir_order.order_num, $orde_num_string)");
$this->db->_protect_identifiers = TRUE;