Как узнать номер в найденных результатах известного ID

antono

Новичок
Как узнать номер в найденных результатах известного ID

Есть запрос - SELECT * FROM table LIMIT 20
ID элементов поизвольные числа, не прогрессия
Известен ID элемента, как найти его номер в найденых по запросу результатах не перебирая все по порядку?

сразу предупреждаю что поиск по форуму да и нете ничего не дал
 

Фанат

oncle terrible
Команда форума
задай вопрос по другому.
напиши здесь не решение задачи, которе ты придумал, а саму задачу.
 

antono

Новичок
Запросом SELECT * FROM table LIMIT 20 выбираются 20 занчений из таблицы, с ID
1, 50, 22, 5, 3, 88, 66, 21, 35, 8, 96, 48.....
как узнать номер позиции например элемента с ID 88?
В данном случае это позиция №6
 

Wicked

Новичок
есть предположение, что речь идет про замысловатый и сомнительный paging :) Что-то похожее мне приходилось делать...

я так понимаю, что если у тебя в запросе нет order by, то тебе вообще не важен порядок :) тогда может отсортировать записи по тому же id ? А дальше бинарный поиск (поиск методом деления отрезка пополам) по резалт сету с помощью mysql_data_seek(). Тогда любой id ищется за log2(count()) операций.
 

Фанат

oncle terrible
Команда форума
Wicked
не надо писать столько умных слов.
тем более, на предположениях.
есть у него сортировка.
 

Wicked

Новичок
ну если есть сортировка - тогда бинарный поиск по сортировочным полям.

ладно, подождем ответа, т.к. то, о чем я рассказываю - это гемор :)
 

Texel

Новичок
Есть вариант


PHP:
set @n:=0;
select @n:=@n+1 as rownum, t.* from t;
Это работает.
 

ilih

Новичок
Автор оригинала: antono
Запросом SELECT * FROM table LIMIT 20 выбираются 20 занчений из таблицы, с ID
1, 50, 22, 5, 3, 88, 66, 21, 35, 8, 96, 48.....
как узнать номер позиции например элемента с ID 88?
В данном случае это позиция №6
PHP:
/**
 * Получение номера страницы (для MySQL >=4.1). 
 * @param string $table Название таблицы 
 * @param string $where Условие WHERE
 * @param integer $record_id ID записи, для которой надо узнать номер страницы 
 * @param integer $limit Количество записей на страницу 
 * @param string $id_field Ключевое поле 
 * @return integer
 */
function get_page($table, $where, $record_id, $limit = 1, $id_field = 'id')
{
	$result = mysql_query("SET @cnt = 0;");
	$sql = "select CEILING(row_num / '".$limit."') as page, row_num from (
	SELECT @cnt := @cnt + 1 AS row_num, ".$table.".".$id_field." as id FROM ".$table." ".$where."
	) as tb where id='".$record_id."'";
	$result = mysql_query($sql);
	$record = mysql_fetch_assoc($result);
	return $record['page'];
}//\\get_page
/**
 * Получение номера страницы (для MySQL <4.1). 
 * @param string $table Название таблицы 
 * @param string $where Условие WHERE
 * @param integer $record_id ID записи, для которой надо узнать номер страницы 
 * @param integer $limit Количество записей на страницу 
 * @param string $id_field Ключевое поле 
 * @return integer 
 */
function get_page($table, $where, $record_id, $limit = 1, 
{
	$result = mysql_query("SET @cnt = 0;");
	$sql = "SELECT @cnt := @cnt + 1 AS row_num, ".$table.".".$id_field." as id FROM ".$table." ".$where;
	$result = mysql_query($sql);
	$rows = mysql_num_rows($result);
	for ($i = 0; $i < $rows; $i++)
	{
		$record = mysql_fetch_assoc($result);
		if ($record['id'] == $record_id)
		{
			return ceil($record['row_num'] / $limit);
		}
	}
}//\\get_page
использование
PHP:
$page = get_page('table', ' order by ??? limit 20', '88', '1', 'ID');
 

Фанат

oncle terrible
Команда форума
ну, к примеру, четыре куска идентичного по виду кода
 

Фанат

oncle terrible
Команда форума
нет, не лучше.

а можно кратенько пояснить - почему это не делается одним запросом и парой строк кода?
 

ilih

Новичок
одним запросом нельзя - сначала необходимо установить переменную, в которой будет храниться номер страницы
по поводу пары строк - сейчас вырезал практически все дополнительные возможности
 

Фанат

oncle terrible
Команда форума
не понял.
а зачем?
всегда думал, что можно просто посчитать количество записей, которые меньше текущей.
а остальное посчитать арифметикой.
разве нет?
 

ilih

Новичок
Автор оригинала: Фанат
не понял.
а зачем?
всегда думал, что можно просто посчитать количество записей, которые меньше текущей.
а остальное посчитать арифметикой.
разве нет?
то есть предлагаете вместо
PHP:
SET @cnt = 0;
select row_num from (select @cnt := @cnt + 1 AS row_num test_table where some_field='aaa' order by name) where id='88'
использовать
PHP:
select count(*) from test_table where some_field='aaa' and name<'поле name записи с id=88'
но тогда нужно знать значение поля name записи с id=88 - это еще один запрос, да и значение поля name необязательно уникальное
и как быть в случае если необходима сортировка по нескольким полям? - если запихать тоже в WHERE, то результат будет неправильный
возможно неправильно понял - к ночи уже хуже соображаю


в функции для MySQL <4.1 можно использовать временную таблицу, тогда обойдется без цикла, но это еще два запроса
 

Wicked

Новичок
Фанат
всегда думал, что можно просто посчитать количество записей, которые меньше текущей.
а остальное посчитать арифметикой.


а ты никогда не пробовал составить это условие "меньше" для произвольного множества полей сортировки? :) довольно таки интересная задача, особенно если принимать во внимание особенности работы с null'ами )
 
Сверху