Какую страницу вывести зная только уникальное поле строки.

Омск

Новичок
Какую страницу вывести зная только уникальное поле строки.

Вобщем вывожу я страницу порциями по 10. LIMIT $begin, 10 мне в этом помогает.
Такой вопрос, как узнать $begin зная только значение уникального поля? Данные выводяться с использованием ORDER BY
 

Омск

Новичок
Вот смотрите.
SELECT id FROM tbl ORDER BY in DESC LIMIT $begin, 10

id уникальное поле.
in постоянно меняеться.
(Есть WHeRE но здесь приводить не стал. Так как не имеет значения в даном примере.)

Так я вывожу страницы. Но например мне надо узнать на какой странице сейчас расположена строка с id 229 или 922 без разницы.
как мне определить страницу. Как узнать $begin, Не проверять же все страницы с самого начала дабы узнать есть ли id 229 или 922
 

zerkms

TDD infected
Команда форума
Омск
я уже написал набор операторов и функций
подумай хоть чуть-чуть
 

Омск

Новичок
Автор оригинала: zerkms
Омск
я уже написал набор операторов и функций
подумай хоть чуть-чуть
Думал, думал. Все равно вижу варианты в переборе.

Нашел решение
http://www.x-forum.info/showthread.php?postid=44158#post44158
Но наврят ли буду его использовать. Может быть есть какой нибудь другой алгоритм?
 

zerkms

TDD infected
Команда форума
[sql]
SELECT CEIL(COUNT(*) / 10) AS `pagenumber` FROM `table` WHERE `id` <= 229
[/sql]
 

Омск

Новичок
SELECT CEIL( COUNT( * ) / 10 ) AS `pagenumber`
вернет количество сообщений всего деленое на 10 и округленное в сторону увелечения до целого числа.
id не обязательно будет <=229 Так как после сортировки по in, полностью поменяеться порядок следования id.

-~{}~ 17.03.08 07:24:

Например. После сортировки по in мы получаем примерно следующее:

id | IN
5 | 1000000
123 | 9999
2 | 1000
1 | 999
435 | 998
438 | 994
43 | 991

Например мы знаем id и он 5. В данном случае строка будет на первой странице. Если мы выводим по 3 сообщения на страницу, и id получили 43 то мы должны получить что нужная нам строка в первом случае находиться на странице 1. Во втором случае на странице 3
 

zerkms

TDD infected
Команда форума
Так как после сортировки по in, полностью поменяеться порядок следования id.
сложно догадаться, что в этом случае нужно посмотреть какой `in` у записи с `id `= 5 и выбирать по `in` >= 1000000
?
 

Омск

Новичок
in может повторяться. Допустим у ид=5 in=0
И таких записей 60(с 0-евым in ). А мы выбираем по 3. Было бы проше если бы in был так же уникален.

-~{}~ 17.03.08 07:36:

Спасибо Вам за ответы.
 

Roman777

Новичок
[sql]select
z1.id,
ceil(z1.number / 3) as page
from
(
select
df1.*,
(select
count(*) + 1
from
tbl as df
and
df1.id > df.id
) as number
from
tbl as df1
order by
df1.in ASC
) as z1
WHERE
z1.id = 229;[/sql]

Извращенский запрос, но сработает:
ceil(z1.number / 3) as page -
- number - порядковый номер строки в выборке
- 3 - количество строк на странице
 

Омск

Новичок
Я не селен в запросах. Почему то этот запрос выдает синтаксическую ошибку. Пробывал исправить, но моих знаний не хватает
 

Wicked

Новичок
я всегда считал, что MySQL говорит что-то более информативное, чем "чувак, у тебя тут эта... синтаксическая ошибка" :)
 

Омск

Новичок
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND df1.id > df.id
) AS number
FROM tbl AS df1
ORDER BY df1.in ASC
) AS z1
' at line 7
 

baev

‹°°¬•
Команда форума
— поменяйте AND на WHERE.

Вообще, если не хватает знаний, то их наверно пополнить надо?
Посмотрев в мануале правильный синтаксис SQL-запроса.
 

Омск

Новичок
SELECT z1.id, ceil( z1.number /3 ) AS page
FROM (

SELECT df1. * , (

SELECT count( * ) +1
FROM rat_in AS df
WHERE df1.id > df.id
) AS number
FROM rat_in AS df1
ORDER BY df1.count_in ASC
) AS z1
WHERE z1.id =16

Увидел када ответ подумал работает) Ура). потестировал и понял, выдает совсем не то. Выдавал следующее:

id=1 page=1
id=2 page=1
id=3 page=1
id=4 page=2
id=5 page=2

И так далее. Вобщем чтобы получить page=ceil( id /3 )

ЗЫ, Я уже менял AND на WHERE но и тогда получил ошибку. Подумал что не в этом дело.

-~{}~ 20.03.08 22:18:

-- Описание входных параметров запроса (их всего два):
-- 1) @ord - задает порядок сортировки:
-- ACS - по возрастанию
-- DESC - по убыванию
-- 2) @id - задает интересующий нас ID
select t1.*,
count(1) - 1 as cnt -- Кол-во строк до нашего ID.
from test t1
join test t2
on (t1.inr > t2.inr or t1.inr = t2.inr and t1.id >= t2.id)
and @ord = 'ASC'
or
(t1.inr < t2.inr or t1.inr = t2.inr and t1.id >= t2.id)
and @ord = 'DESC'
group by t1.id, t1.inr
having t1.id = @id
 

Roman777

Новичок
Автор оригинала: Омск
SELECT z1.id, ceil( z1.number /3 ) AS page
FROM (

SELECT df1. * , (

SELECT count( * ) +1
FROM rat_in AS df
WHERE df1.id > df.id
) AS number
FROM rat_in AS df1
ORDER BY df1.count_in ASC
) AS z1
WHERE z1.id =16

Увидел када ответ подумал работает) Ура). потестировал и понял, выдает совсем не то. Выдавал следующее:

id=1 page=1
id=2 page=1
id=3 page=1
id=4 page=2
id=5 page=2

И так далее. Вобщем чтобы получить page=ceil( id /3 )

ЗЫ, Я уже менял AND на WHERE но и тогда получил ошибку. Подумал что не в этом дело.

-~{}~ 20.03.08 22:18:

-- Описание входных параметров запроса (их всего два):
-- 1) @ord - задает порядок сортировки:
-- ACS - по возрастанию
-- DESC - по убыванию
-- 2) @id - задает интересующий нас ID
select t1.*,
count(1) - 1 as cnt -- Кол-во строк до нашего ID.
from test t1
join test t2
on (t1.inr > t2.inr or t1.inr = t2.inr and t1.id >= t2.id)
and @ord = 'ASC'
or
(t1.inr < t2.inr or t1.inr = t2.inr and t1.id >= t2.id)
and @ord = 'DESC'
group by t1.id, t1.inr
having t1.id = @id
Правильно что ты увидел вот такое:

id=1 page=1
id=2 page=1
id=3 page=1
id=4 page=2
id=5 page=2
Но такое ты мог увидеть только в том случае, если не задавал условие WHERE z1.id =16, в противном случае ты бы получил все одну строку
. Например такую: id=16 page=4
 

Омск

Новичок
Автор оригинала: Roman777
Правильно что ты увидел вот такое:

id=1 page=1
id=2 page=1
id=3 page=1
id=4 page=2
id=5 page=2
Но такое ты мог увидеть только в том случае, если не задавал условие WHERE z1.id =16, в противном случае ты бы получил все одну строку
. Например такую: id=16 page=4
Я увидел и так одну строку. Просто када указывал id=1 переменная page=1. если указывал id=5 page=2. И так далее. Указад бы 100, получил бы 34.
 
Сверху