Конференция "Базы" » Помогите с запросом (бд MySQL)
 
  • Dmitry S © (21.07.08 01:39) [0]
    Есть таблица. Ключевое поле id.

    Задан порядок сортировки строкой ORDER BY `field1` ASC, `field2` DESC, ... и так далее. Вобщем это значение зависит от пользователя. Какую он сортировку или комбинацию сортировок выберет - такая строка и будет.

    Таблица выводится пользователю постранично по K элементов на страницу.

    Необходимо построить такой запрос, чтобы можно было установить на какой странице будет строка с id=X в таблице с заданной сортировкой?

    Пока мне в голову приходит такая мысль:
    1. Распарсить строку сортировки. Установить какие поля в ней использутся.
    2. Выполнить запрос:
    SELECT `field1`, `field2`, ... FROM `sometable` WHERE `id`=X


    3. Выполнить запрос:
    SELECT COUNT(*) FROM `sometable` WHERE
     (`field1`<field1X) or (`field1`=field1X and `field2`>field2X ) or (`field1`=field1X and `field2`=field2X and `field3`>field3X )

    ... где field*X - это результат выполнения запроса в пункте 2.
    4. На основе количества строк лежащих "выше" данной расчитать позицию текущей.

    У кого-нибудь есть варианты по-проще?
  • sniknik © (21.07.08 08:30) [1]
    LIMIT
  • Dmitry S © (21.07.08 09:37) [2]

    > sniknik ©

    А чем Лимит в данной ситуации поможет?
  • sniknik © (21.07.08 10:23) [3]
    сделает вот это
    > Таблица выводится пользователю постранично по K элементов на страницу.
    выделит то что на странице.
  • Dmitry S © (21.07.08 10:43) [4]
    Так это понятно. Несложный расчет и разбиение по страницам.

    Вобщем задача такая. Пользователь добавляет строку в таблицу. После вставки необходимо показать ту страницу, на которой данная строка появилась. При определенных сортировках новая строка может быть как в начале или конце таблицы, так и в середине.

    Вот отсюда и более конкретная задача: имеется id, нужно определить такие, грубо говоря, A и B, чтобы запрос
    SELECT * FROM `sometable` ORDER BY `field1` ASC, `field2` DESC, ... LIMIT A, B
    содержал в себе данную строку (с имеющимся id).
    Причем B - это количество строк на странице, а А - кратна B (A mod B = 0).
  • sniknik © (21.07.08 11:01) [5]
    SET @recNo:=0;
    SELECT @recNo:=n FROM (
    SELECT @recNo:=@recNo+1 n, id FROM t ORDER BY `field1` ...) s
    WHERE id=9;


    вот это говорят в mysql работает для получения номера позиции в выборке, получить следующим запросом в пакете блок с LIMIT A, B где @recNo >=A and @recNo < B дело техники.
  • Dmitry S © (21.07.08 15:52) [6]
    Спасибо! Отличная идея!
 
Конференция "Базы" » Помогите с запросом (бд MySQL)
Есть новые Нет новых   [134435   +33][b:0][p:0.001]