playlist
+----+----------+---------------+
| id | uploader | name |
+----+----------+---------------+
| 1 | 1 | Testplaylist1 |
| 2 | 1 | ... |
+----+----------+---------------+
playlistvideo
| id | plid | videoid | videopos |
+----+------+---------+----------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 2 |
| 3 | 1 | 3 | 3 |
| 4 | 1 | 4 | 4 |
| 5 | 1 | 5 | 5 |
| 6 | 1 | 6 | 6 |
| 7 | 2 | ... | ... |
+----+------+---------+----------+
У меня есть эти две таблицы (среди прочих) и Я пытаюсь обновить позицию видео в playlistvideo Таблица. Мне нужно следовать этим «условиям / ограничениям»:
videopos
переменная $newPos
между 1 и 6, скажем, 2.videoid
быть «перемещенным» в новую позицию, 2, это идентификатор видео, принадлежащий другому videopos
переменная $oldPos
Скажем, позиция 1. playlistvideo.plid
должен принадлежать конкретному загрузчику в playlist.uploader
в данном случае загрузчик 1.Так что это означает, что я буду шаг за шагом бегать по всем videoid : videopos
с позиции 1 до N во всех плейлистах загрузчика 1 каждый раз, когда происходит изменение.
Вот пример данных, с которыми я могу работать, когда в первом списке воспроизведения позиция видео 2 была перемещена в позицию видео 1. Вы можете видеть, что позиции возобновляются немного вниз, это означает, что мы находимся во втором списке воспроизведения и не движемся произошло Это из массива, где массив индексов ($newPos
) действует как видео-позиции в каждом плейлисте.
newPos: 1 oldPos: 2
newPos: 2 oldPos: 1
newPos: 3 oldPos: 3
newPos: 4 oldPos: 4
newPos: 5 oldPos: 5
newPos: 6 oldPos: 6
newPos: 1 oldPos: 1
newPos: 2 oldPos: 2
newPos: 3 oldPos: 3
newPos: 4 oldPos: 4
Может ли запрос MySQL справиться с этим или мне нужно больше данных?
Вы могли бы сделать следующее
if ($newPos > $oldPos)
{
$query = "UPDATE playlistvideo SET videopos = IF(videopos = $oldPos, $newPos, videopos -1) WHERE videopos >= $oldPos AND videopos <= $newPos";
}
else if ($newPos < $oldPos)
{
$query = "UPDATE playlistvideo SET videopos = IF(videopos = $oldPos, $newPos, videopos +1) WHERE videopos >= $newPos AND videopos <= $oldPos";
}
Чтобы сделать это полностью в SQL это было бы
UPDATE playlistvideo
SET videopos = IF(videopos = $oldPos, $newPos, videopos + IF($oldPos > $newPos,1,IF($oldPos = $newPos, 0, -1)))
WHERE videopos BETWEEN $newPos AND $oldPos
Других решений пока нет …