2013-04-13 7 views
1

Есть некоторые идентификаторы:Сортировка строк в том же порядке, указанном в MySQL IN()

$ids = "'55-30269','50-30261','50-30254','50-30257','50-30268','50-30253'"; 

есть этот запрос:

$sql = "SELECT * FROM `report` WHERE `id` IN ($ids)"; 

Я хочу строк, чтобы быть в том же порядке, как указано в $ids. Вместо этого я получаю порядок, по которому эти строки были первоначально вставлены в таблицу.

Кроме того, я не уверен, зачем мне нужно, чтобы каждый из идентификаторов был помещен в кавычки '55-30269', но запрос не выполняется другим способом. Например. $ids = "55-30269,50-30261,50-30254,50-30257,50-30268,50-30253";

+0

Вам нужно будет использовать кавычки, в противном случае вы будете соответствовать только первые два номера перед '-' – Fabio

+1

[' FIELD (ул str1, str2, str3, ...) '] (HTTP: // Dev. mysql.com/doc/refman/5.5/en/string-functions.html#function_field) или ['FIND_IN_SET (str, strlist)'] (http://dev.mysql.com/doc/refman/5.5/en/ string-functions.html # function_find-in-set) приходит на ум. –

+1

@ M8R-1jmw5r 'FIELD()' :) –

ответ

6

Потому что тип данных ID - это строка. Строковые литералы должны быть обернуты одинарными кавычками. Если вы хотите заказать результат на основе указанного ID, используйте FIELD() для пользовательского переупорядочения.

SELECT * 
FROM report 
WHERE ID IN ($ids) 
ORDER BY FIELD(ID, $ids) 

Причина, почему вы не получаете точный результат при прохождении ID без одинарные кавычки,

$ids = "55-30269,50-30261,50-30254,50-30257,50-30268,50-30253" 

потому, что MySQL выполняет арифметические на значения.

55-30269 = -30216 
50-30261 = -30211 
...