Magiys
Новичок
Выборка записи с одновременным получением id следующей и предыдущей записи записи
Такая проблема:
1. Есть две таблицы одна пусть называется _screens, другая - _products.
2. _screens - подчиненная таблица, _products - главная, связь одни ко многим.
Пример содержимого _screens
screenID | screenProductID | screenField1 | screenSort
1 | 1 | data1 | 0
2 | 1 | data2 | 3
3 | 1 | data3 | 5
4 | 2 | data4 | 0
5 | 2 | data5 | 2
6 | 2 | data6 | 7
3. На сайте есть некий элемент, который отображает скриншот и у него есть две ссылки: следующий, предыдущий.
4. В результате запроса необходимо получить:
Входных параметров может быть два: это screenProductID и screenID, но по идее screenID - этого достаточно.
Входной параметр, допустим, screenID = 2
screenID | screenProductID | screenField1 | screenSort | lastScreenID | nextScreenID | screenSum
2 | 1 | data1 | 3 | 0 | 2 | 3
Входной параметр, допустим, screenID = 4
screenID | screenProductID | screenField1 | screenSort | lastScreenID | nextScreenID | screenSum
4 | 2 | data4 | 0 | 6 | 4 | 3
Где:
lastScreenID - ID предыдущего скриншота, в зависимости от screenSort, если screenSort для указанного screenID минимальное, то необходимо взять screenID, у которого screenSort максимален.
lastScreenID - ID следующего скриншота, в зависимости от screenSort, если screenSort для указанного screenID максимально, то необходимо взять screenID, у которого screenSort минимален.
То есть должна быть циклическая прокрутка в обе стороны при нажатии на ссылки "следующий", "предыдущий".
Причем, screenSort изменяется неравномерно.
======
Пробывал так:
Тут я не могу установить зависимость между lastScreenID и maxScreenSort, nextScreenID и minScreenSort.
Как я писал, одно их этих полей в паре должно быть использовано. Так, например, если текущий screenID имеет минимально значение screenShort, то lastScreenID - будет равно NULL, в этом случае необходимо взять maxScreenSort в качестве этого значения.
Надеюсь на помощь.
P.S. Возможно, все гораздо легче...
P.S.S. Может возникнуть вопрос, почему именно необходимо реализовывать такую навигацию по скриншотам через указания ID, я хочу сделать ссылки, прямо указывающие на тот или иной скриншот, а не относительно отображаемого текущего скриншота.
Такая проблема:
1. Есть две таблицы одна пусть называется _screens, другая - _products.
2. _screens - подчиненная таблица, _products - главная, связь одни ко многим.
Пример содержимого _screens
screenID | screenProductID | screenField1 | screenSort
1 | 1 | data1 | 0
2 | 1 | data2 | 3
3 | 1 | data3 | 5
4 | 2 | data4 | 0
5 | 2 | data5 | 2
6 | 2 | data6 | 7
3. На сайте есть некий элемент, который отображает скриншот и у него есть две ссылки: следующий, предыдущий.
4. В результате запроса необходимо получить:
Входных параметров может быть два: это screenProductID и screenID, но по идее screenID - этого достаточно.
Входной параметр, допустим, screenID = 2
screenID | screenProductID | screenField1 | screenSort | lastScreenID | nextScreenID | screenSum
2 | 1 | data1 | 3 | 0 | 2 | 3
Входной параметр, допустим, screenID = 4
screenID | screenProductID | screenField1 | screenSort | lastScreenID | nextScreenID | screenSum
4 | 2 | data4 | 0 | 6 | 4 | 3
Где:
lastScreenID - ID предыдущего скриншота, в зависимости от screenSort, если screenSort для указанного screenID минимальное, то необходимо взять screenID, у которого screenSort максимален.
lastScreenID - ID следующего скриншота, в зависимости от screenSort, если screenSort для указанного screenID максимально, то необходимо взять screenID, у которого screenSort минимален.
То есть должна быть циклическая прокрутка в обе стороны при нажатии на ссылки "следующий", "предыдущий".
Причем, screenSort изменяется неравномерно.
======
Пробывал так:
Код:
SELECT
t.*,
(
SELECT screenID
FROM screens
WHERE screenShort < t.screenShort
LIMIT 1
) as lastScreenID,
(
SELECT screenID
FROM screens
WHERE screenShort > t.screenShort
LIMIT 1
) as nextScreenID
FROM
(
SELECT
scr1.*,
MIN(scr2.screenSort) as minScreenSort,
MAX(scr2.screenSort) as maxScreenSort,
COUNT(scr2.screenID) as sumScreens
FROM
screens as scr1
WHERE
scr1.screenID=$screenID
LEFT JOIN
screens as scr2 ON scr2.screenProductID=scr1.screenProductID
GROUP BY
scr2.screenProductID
) as t
Как я писал, одно их этих полей в паре должно быть использовано. Так, например, если текущий screenID имеет минимально значение screenShort, то lastScreenID - будет равно NULL, в этом случае необходимо взять maxScreenSort в качестве этого значения.
Надеюсь на помощь.
P.S. Возможно, все гораздо легче...
P.S.S. Может возникнуть вопрос, почему именно необходимо реализовывать такую навигацию по скриншотам через указания ID, я хочу сделать ссылки, прямо указывающие на тот или иной скриншот, а не относительно отображаемого текущего скриншота.