Mysql Codeigniter Active Record – как мне сделать запрос where_in и вернуть правильный порядок результатов?

У меня есть набор идентификаторов, переданных в определенном порядке, которые необходимо сохранить. Я запрашиваю из нескольких левых соединений данные, связанные с каждым 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.

Спасибо,

Чтобы заказать результат по порядку в вашем массиве, вы можете сделать следующее:

 $array_of_ordered_ids = array(4,5,2,6); 

Поскольку вы уже знаете порядок номеров, вы можете использовать функцию Docs Mysql FIELD() :

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

Как и все ответы, которые я нашел на 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... 

см. также здесь: http://ellislab.com/forums/viewthread/137157/#1058666

Спасибо за самое большое решение.

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