Mysql Codeigniter Active Record - Как мне выполнить запрос where_in и вернуть правильный порядок результатов? - PullRequest
5 голосов
/ 16 сентября 2011

У меня есть набор идентификаторов, переданных в определенном порядке, который необходимо сохранить.Я запрашиваю от нескольких левых соединяет данные, связанные с каждым идентификатором.Идентификаторы возвращаются из поиска, поэтому необходимо сохранить порядок, чтобы сделать результаты действительными (в противном случае поиск становится довольно бессмысленным.)

Мой код выглядит примерно так:-

$this->db->where_in('id', array(4,5,2,6));

Вернет результаты в порядке 2,4,5,6.

Я бы хотел, чтобы он сохранил порядок и вернул результаты 4,5,2,6.

Спасибо,

Ответы [ 3 ]

5 голосов
/ 16 сентября 2011

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

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

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

ORDER BY FIELD(id, 4, 5, 2, 6);

Для создания такой строки вы можете использовать implode Документы :

$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); 
4 голосов
/ 26 мая 2014

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

0 голосов
/ 20 июня 2016

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

 $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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...