Получить результат из mysql, упорядоченного по предложению IN - PullRequest
2 голосов
/ 15 июня 2010

У меня есть следующий запрос

SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27)

Мой результат:

invoice_id | invoice_number | ...
------------------------------------
9          | 201006003      |
13         | 201006020      |
15         | 201006022      |
27         | 201006035      |

, который является желаемым набором результатов, за исключением того, что он упорядочен по invoice_id (который является значением автоинкремента).

Теперь я хочу получить результат в порядке, указанном в запросе (13, 15, ...). Есть ли способ добиться этого?

Фон в том, что у меня есть DataTable, привязанный к DataGridView. Пользователь может фильтровать и сортировать результат, но если он хочет напечатать результат, я не использую DataTable для печати, потому что он содержит только самые важные столбцы, и вместо этого я извлекаю целые записи из базы данных и передаю их моему контролю печати. .

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

Ответы [ 2 ]

3 голосов
/ 15 июня 2010

Требуется порядок FIELD по параметру.

SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27) ORDER BY FIELD (invoice_id, 13, 15, 9, 27)
3 голосов
/ 15 июня 2010

Это ужасно, но вы могли бы сделать:

ORDER BY CASE invoice_id WHEN 13 THEN 0 WHEN 15 THEN 1 WHEN 9 THEN 2 WHEN 27 THEN 3 ELSE 4 END

На самом деле есть функция FIELD:

ORDER BY FIELD(invoice_id, 13, 15, 9, 27)

Функция FIELD возвращает позицию первого аргумента в списке остальных.

Или, если вы генерируете его динамически, вы можете сделать:

WHERE invoice_id IN ({list}) ORDER BY FIND_IN_SET(invoice_id, '{list}')
...