MySQL: мне нужно получить смещение элемента в запросе - PullRequest
1 голос
/ 02 апреля 2010

Mysql: мне нужно получить смещение элемента в запросе.

У меня есть галерея изображений: это показывает 6 изображений в стеке, поэтому, когда я запрашиваю изображение 22, он показывает изображения с 18 до 24. Сначала он должен получить смещение изображения 22, а затем получить изображения с 18 до 24.

Другой пример: я запрашиваю номер изображения 62 (и смещение 62), он будет выбирать изображения со смещением от 60 до 66.

Возможно ли с одним запросом?

Главное, чтобы значение смещения элемента, чей идентификатор был равен числу.

Спасибо;)

EDIT: select * from images order_by updated_at offset (здесь мне нужно получить смещение идентификатора изображения в этом запросе и произвести некоторые вычисления ... это то, что мне нужно, если это возможно ..: d)

EDIT2: Теперь я понимаю, что мне нужно 2 запроса:

1º: получить смещение изображения в запросе с моим заказом

2º: получить изображения, используя смещение из первого запроса ... это я могу сделать самостоятельно, первое - это проблема ..: s

Ответы [ 4 ]

3 голосов
/ 02 апреля 2010

Если ваши изображения имеют последовательные идентификаторы, вы можете сделать следующее:

SELECT    * 
FROM      images 
WHERE     id >= ((? DIV 6) * 6) AND 
          id < (((? DIV 6) + 1) * 6)
ORDER BY  id;

Заменить параметр ? в приведенном выше запросе идентификатором запрошенного изображения.


ОБНОВЛЕНИЕ: Кажется, что ваши изображения упорядочены не по последовательному идентификатору, а по метке времени.К сожалению, похоже, что MySQL не поддерживает выражения переменных в предложении LIMIT ( Source ).Один из вариантов - использовать подготовленный оператор:

PREPARE stmt FROM 
" SELECT    * 
  FROM      images
  ORDER BY  updated_at
  LIMIT     ?, 6";

SET @lower_limit := ((22 DIV 6) * 6);

EXECUTE stmt USING @lower_limit;

Другой вариант:

SET @row = 0;

SELECT    * 
FROM      images 
WHERE     (@row := @row + 1) BETWEEN ((3 DIV 6) * 6) + 1 and (((3 DIV 6) + 1) * 6)
ORDER BY  updated_at;
1 голос
/ 02 апреля 2010

Возможно, я вас не понимаю, но почему вы должны делать все в MySQL?

Предположим, вы используете ЛАМПУ:

$pagination_start = (int)(floor($id_requested / 6)*6);
$offset_array = ($id_requested % 6);
$offset_mysql = $pagination_start + $offset_array;

Теперь у вас есть начало пагинации в $pagination_start [т.е. 60] и запрашиваемое смещение изображения [т.е. 62] в $offset_mysql:

SELECT   image
FROM     images
ORDER BY updated_at DESC
LIMIT    $pagination_start, 6

Теперь взамен вы получаете массив, содержащий 6 изображений, и запрашиваемое значение находится на $result[$offset_array].

1 голос
/ 02 апреля 2010

РЕДАКТИРОВАТЬ: Похоже, MySQL не позволяет такого рода выражения в предложении OFFSET. Если вы можете использовать подготовленный оператор (либо непосредственно в SQL, либо на другом языке), вы можете сделать расчет заранее и использовать его. См. Даниэль ответ на этот вопрос. Я оставляю здесь этот ответ из-за другой полезной информации.

То, что вы ищете, называется нумерацией страниц. В MySQL это можно сделать с помощью ключевых слов LIMIT и OFFSET:

SELECT   image
FROM     images
ORDER BY updated_at
LIMIT    6
OFFSET   (DIV(?, 6) * 6)

Заменить ? запрошенным индексом изображения. Обратите внимание, что это даст изображения со смещением 60, 61, 62, 63, 64, 65 при запросе изображения 62. Я предположил, что последнее смещение, которое вы дали в примерах, было эксклюзивным. Вы должны соответственно скорректировать, если я сделал неверное предположение.

И небольшое объяснение:

LIMIT заставляет запрос возвращать только заданное количество результатов. Потому что вы всегда хотите шесть, это легко.

OFFSET заставляет запрос возвращать только результаты с заданным смещением. Вычисление делает целочисленное деление на шесть и умножает на шесть. Это приводит к предыдущему кратному шести из данного числа, именно то, что вы хотите.

0 голосов
/ 02 апреля 2010
SELECT   image
FROM     images
ORDER BY updated_at
LIMIT    6, FLOOR($number / 6 ) * 6;
...