Подумайте, используя strtok_r
, как предложили другие, или что-то вроде:
void printWords(const char *string) {
// Make a local copy of the string that we can manipulate.
char * const copy = strdup(string);
char *space = copy;
// Find the next space in the string, and replace it with a newline.
while (space = strchr(space,' ')) *space = '\n';
// There are no more spaces in the string; print out our modified copy.
printf("%s\n", copy);
// Free our local copy
free(copy);
}
Используйте функцию MySQL FIELD()
:
SELECT name, description, ...
FROM ...
WHERE id IN([ids, any order])
ORDER BY FIELD(id, [ids in order])
FIELD()
возвратит индекс первого параметра, который равен первому параметру (кроме самого первого параметра).
FIELD('a', 'a', 'b', 'c')
возвратится 1
FIELD('a', 'c', 'b', 'a')
, возвратится 3
, Это сделает точно, что Вы хотите при вставке идентификаторов в IN()
пункт и эти FIELD()
функция в том же порядке.
Два решения, которые приходят на ум:
order by case id when 123 then 1 when 456 then 2 else null end asc
order by instr(','||id||',',',123,456,') asc
(instr()
от Oracle; возможно, Вы имеете locate()
или charindex()
или что-то как этот)
В пункте описывает ряд значений, и наборы не имеют порядка.
Ваше решение с соединением и затем заказывающий на display_order
столбец является ближе всего правильным решением; что-либо еще - вероятно, определенный для DBMS взлом (или делает некоторый материал с функциями OLAP в стандартном SQL). Конечно, соединение является ближе всего портативным решением (хотя генерируя данные с display_order
, значения могут быть проблематичными). Обратите внимание, что Вы, возможно, должны выбрать столбцы упорядочивания; это раньше было требованием в стандартном SQL, хотя я полагаю, что он был ослаблен, как правило, только что (возможно, уже в SQL-92).
Моя первая мысль должна была записать единый запрос, но Вы сказали, что это не было возможно, потому что каждый выполняется пользователем, и другой выполняется в фоновом режиме. Как Вы храните список идентификаторов для передачи от пользователя фоновому процессу? Почему бы не помещать их во временную таблицу со столбцом для выражения порядка.
Так как насчет этого:
Дайте этому выстрел:
SELECT name, description, ...
WHERE id IN
(SELECT id FROM table1 WHERE...)
ORDER BY
(SELECT display_order FROM table1 WHERE...),
(SELECT name FROM table1 WHERE...)
то, ГДЕ, вероятно, возьмет немного тонкой настройки для получения связанных подзапросов, работающих правильно, но основной принцип должен быть звуковым.