У меня есть таблица MySQL, которую я проиндексировал с помощью Sphinx, с кучей столбцов в качестве атрибутов, по которым я хочу, чтобы мои пользователи сортировали свои результаты поиска (например, по имени, рейтингу и т. Д.).
ИтакЯ говорю Sphinx сделать это (например, в PHP):
$sphinx = new SphinxClient();
// Retrieve $query, $sort_attr, and $order from $_GET
$sphinx->SetMatchMode(SPH_MATCH_ANY);
$sphinx->SetArrayResult(true);
$sphinx->SetSortMode($order, $sort_attr);
$sphinx->SetLimits( /* something reasonable, <1000 */ );
$results_sphinx = $sphinx->Query($query, 'table');
Это работает, и я получаю свои упорядоченные результаты.
Я также хочу отобразить все атрибуты (и некоторые другиестолбцы, которые должны оставаться неиндексированными) как часть результатов поиска.Это означает, что мне нужно получить каждый элемент результатов поиска из БД.
Поэтому я выполняю следующий вызов MySQL:
SELECT id, colA, colB, [...] FROM table WHERE table.id IN ([IDs returned from Sphinx, in some sorted order])
Однако, даже если мой список идентификаторов вернулся изСфинкс находится в некотором отсортированном порядке в соответствии со столбцами атрибутов (например, в алфавитном порядке), WHERE IN будет возвращать результаты в порядке столбца индекса таблицы, который в этом случае является самими идентификаторами.
Единственная опция, которую я имею в виду, - это использовать ORDER BY:
SELECT id, colA, colB, [...] FROM table WHERE table.id IN ([IDs returned from Sphinx, in some sorted order]) ORDER BY [attribute] [DESC|ASC]
Это работает, но я только что заставил Sphinx и MySQL сортировать один и тот же набор данных для каждого экземпляра поиска.Это чувствует себя неоптимальным.Я не думаю, что могу оставить сортировку для последнего вызова MySQL, так как я собираюсь разбивать на страницы в своих результатах, поэтому идентификаторы, возвращаемые из Sphinx, должны быть в каком-то порядке для начала.
МожетStackOverflow найти мне способ избежать этой избыточности?Пожалуйста, выделите все, что я сделал выше.
Спасибо!