количество записей до текущей.

sage

Новичок
количество записей до текущей.

детальная товара. требуется узнать на какой странице выводится товар в списке товаров. особенность в том, что все товары при выводе сортируются по кол-ву на складе (те, которых в данный момент нет, идут в самом конце) и по названию. Название - поле неуникальное. Как сие реализовать? Сейчас реализовано несколько громоздко: выбираются все товары, затем в цикле пока id товара != $_GET['id'] кол-во строк++. Заранее большое спасибо.
 

Popoff

popoff.donetsk.ua
$i_count - количество на складе для текущего товара
$s_name - название текущего товара

Сначала выбираем количество элементов перед текущим (схема запроса при сортировке по двум полям):

[sql]
select count(*) from t_tovar where i_count<=$i_count and (i_count<$i_count or i_count=$i_count and s_name<$s_name)
[/sql]

Обзовём полученное число, к примеру, $i. Страницу из этого числа можно получить по формуле:

floor($i / $i_perpage);

где $i_perpage - количество элементов на одной странице. Страницы нумеруются с 0.
 

alpine

Новичок
sage
Например, выбрать номер строки можно так:
[sql]
SET @cnt =0;
SET @scnt = NULL ;

SELECT `id` , @cnt := @cnt +1 AS `row`, IF (id =_ВАШ_ID_, @scnt := @cnt , NULL) FROM `cat`ORDER BY `title` DESC ;

SELECT @scnt; /* Возвращает номер строки в выборке для id =_ВАШ_ID_ */
[/sql]
 

Popoff

popoff.donetsk.ua
Название - поле неуникальное.
А, я просмотрел. Если название - поле неуникальное, то приведённый мной выше способ работать не будет, так как связка (количество_на_складе + название) не определяет однозначно позицию элемента в списке.

Нужно сортировать дополнительно по третьему уникальному полю, к примеру, по идентификатору товара.

alpine
А индексы?

Да, я тут подумал, в моём способе для получения позиции записи лучше сделать несколько запросов. Позицию получать как сумму всех значений:

SELECT count( * )
FROM t_tovar
WHERE i_count < $i_count

SELECT count(*)
FROM t_tovar
WHERE i_count = $i_count AND s_name < $s_name

SELECT count(*)
FROM t_tovar
WHERE i_count = $i_count AND s_name = $s_name and k_tovar<$k_tovar

Если есть индекс (i_count,s_name,k_tovar), то все запросы будут выполнены очень быстро, по индексам, без обращения к данным таблицы. В первом случае MySQL будет ходить по таблице, пропустив при этом только элементы, которые находятся после текущего.
 

sage

Новичок
Фанат
к сожалению, может быть и такое. магазин партнёрский, присутствуют товары с одинаковыми названиями.
Popoff
как сумму? хм.... возможен случай, когда даже 1-ый запрос вернёт все записи, если кол-во на складе максимальное
 

Popoff

popoff.donetsk.ua
sage

допустим, на складе 1000 ручек, 1000 телефонов и ещё раз 1000 телефонов. - это соответствует твоим требованиям.

читаем текст запросов.

первый - возвращает количество любого товара, которого СТРОГО МЕНЬШЕ чем 1000.

второй возвращает количество товаров, которых на складе РОВНО 1000 штук, но которые находятся в списке перед телефонами.

а третий - это количество телефонов с количеством 1000 штук, но с меньшим идентификатором.

даже если больше 1000 штук у тебя на складе ничего нет, всё равно все три запроса могут вернуть число, отличное от 0.
 

sage

Новичок
чего-то я всё равно не понимаю про сумму...
пусть у нас есть 5 товаров:

название - кол-во на складе

телефон 1 - 500
телефон 2 - 300
телефон 3 - 700
телефон 4 - 500
телефон 5 - 500

разбивка по 1 товару на страницу, т.е. всего 5 страниц. хотим определить, на какой странице находится телефон 3.

SELECT count( * )
FROM t_tovar
WHERE i_count < 700

уже вернёт 4.
 

Popoff

popoff.donetsk.ua
А если так:

телефон 1 - 500
телефон 2 - 300
телефон 3 - 700
телефон 4 - 700
телефон 5 - 500
телефон 6 - 500

На какой странице находится телефон 3, а на какой - телефон 4?
 

wizard

Новичок
Выбрать все ID товаров в том же порядке в котором происходит выборка товаров,
потом array_chunk($idsArray, $itemsPerPage); и смотреть, на какой странице товар.... ИМХО, так.

По пьяни опечатался ;) Исправил :)
 

sage

Новичок
Popoff
на телефон 3 отработает только первый запрос и вернёт 4.
на телефон 4 отработают 1-ый и 2-ой запросы. результат - 5.

-~{}~ 14.09.06 08:57:

если по 1-ому товару на страницу, страницы явно не совпадают
 

Popoff

popoff.donetsk.ua
на телефон 3 отработает только первый запрос и вернёт 4.
на телефон 4 отработают 1-ый и 2-ой запросы. результат - 5.
какой второй запрос? ты же сказал, что первый запрос вернёт сразу нужное значение?
если по 1-ому товару на страницу, страницы явно не совпадают
с чем они не совпадают?
 

sage

Новичок
ты же сказал, что первый запрос вернёт сразу нужное значение?
не говорил такого ) рассмотрим твой пример. телефон 3. если разбивка идёт по 1 товару на страницу, то телефон 3 выводится на 3 странице. результат первого твоего запроса - 4, т.е. получается 4 страница.
 
Сверху