Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 32
1
MySQL

Запрос на ротацию записи

17.09.2021, 15:16. Показов 1344. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день,

Есть таблица

id | name | text | activ
---------------------------------
1 | n_1 | 0 |
---------------------------------
2 | n_2 | txt txt2 | yes
---------------------------------
3 | n_3 | txt txt3 |
---------------------------------
4 | n_4 | 0 |
---------------------------------
5 | n_5 | txt txt5 |


и т.д. до 20 шт.

Нужно сделать запрос изменяющий поле `activ` по порядку, когда дойдет до конца вернуться к началу. "yes" может быть только один раз у одной строчки и `text` которого не равно = 0.
Т.е. следующий должен быть #3. Потом 5, далее 6,7, если они пустые, то вернуться на №2

Понимаю, должно быть два запроса, первый выборка, потом запись. Как сделать не могу придумать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2021, 15:16
Ответы с готовыми решениями:

Запрос: вывести все записи одной таблицы, и совпадающие записи другой
SELECT .ФИО AS ФИО, .Паспорт AS , .Телефон AS Телефон FROM Source INNER JOIN Compare ON...

Реализовать ротацию файла лога
Задачка: Реализовать ротацию файла лога с глубиной ротации до 5 файлов при достижении размера в...

наблюдаю ротацию выдачи ТОП4
С периодом в минут 5ть вводил в поиск один и тот-же ключ, каждый раз позиции ТОП4 менялись...

Изменить ротацию в юнити объекте
Всем привет. Задача описана в названии. Хочу сделать монетку, которая будет вращаться вокруг своей...

2
2432 / 2282 / 594
Регистрация: 27.05.2011
Сообщений: 7,801
17.09.2021, 18:01 2
Лучший ответ Сообщение было отмечено sem108 как решение

Решение

SQL
1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM test;
+------+------+----------+--------+
| id   | name | text     | active |
+------+------+----------+--------+
|    1 |      | 0        |        |
|    2 |      | txt txt2 |        |
|    3 |      | txt txt2 | yes    |
|    4 |      | 0        |        |
|    5 |      | txt txt2 |        |
|    6 |      | txt txt2 |        |
+------+------+----------+--------+
Идея в том, чтобы найти 3 ид, 1 из них может быть null
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT  t1.id AS currentActiveId, t2.id AS nextActiveId, t3.id AS firstActiveId FROM test t1
LEFT JOIN test t2
ON (t1.id < t2.id AND t2.text <> '0')
LEFT JOIN test t3
ON (t1.id > t3.id AND t3.text <> '0' )
 
WHERE 
t1.active = 'yes'
ORDER BY t2.id, t3.id LIMIT 1;
 
+-----------------+--------------+---------------+
| currentActiveId | nextActiveId | firstActiveId |
+-----------------+--------------+---------------+
|               3 |            5 |             2 |
+-----------------+--------------+---------------+
Полный запрос выглядит так. Обернул селект в cte и заапдейтил
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH update_cte AS (
SELECT  t1.id AS currentActiveId, t2.id AS nextActiveId, t3.id AS firstActiveId FROM test t1
LEFT JOIN test t2
ON (t1.id < t2.id AND t2.text <> '0')
LEFT JOIN test t3
ON (t1.id > t3.id AND t3.text <> '0' )
 
WHERE 
t1.active = 'yes'
ORDER BY t2.id, t3.id LIMIT 1
)
 
UPDATE update_cte 
JOIN test 
ON update_cte.currentActiveId = test.id OR test.id = IFNULL(update_cte.nextActiveId, update_cte.firstActiveId)
SET STATUS = IF(STATUS = 'active', '', 'active');
1
0 / 0 / 0
Регистрация: 11.01.2018
Сообщений: 32
19.09.2021, 09:33  [ТС] 3
Большое спасибо, у вас очень элегантное решение.

Два вопроса.

Первый, как добавить дополнительное условие чтобы исключить отдельные записи, добавляю NOT IN
WHERE t1.active = 'yes' AND NOT IN () не работает.


И второй, вы использовали WITH update_cte AS (
WITH поддерживает с 8 версии Mysql, а что делать с 5.7 ?

Добавлено через 12 минут
уточнение

SQL
1
WHERE t1.active = 'yes'   AND t2.id NOT IN (14,15)
как бы работает, в выборке отсутствуют 14 и 15 id, НО если добавить NOT IN (14,15, 16) , а 16 последний, то выдает пустой запрос.
0
19.09.2021, 09:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2021, 09:33
Помогаю со студенческими работами здесь

Как сделать правильную ротацию банеров с запоминанием
Всем привет, я не очень хороший программист так что не корите меня за мои знания, вопрос такой: ...

Как сделать автоматическую ротацию картинок в определенном месте страницы?
Мне необходимо, чтобы около 30 картинок сменяли друг друга каждые 1-2 секунды, без перезагрузки...

Как можно сделать ротацию папок в определенном каталоге по количеству?
Добрый день! Как можно сделать ротацию папок в определенном каталоге по количеству? Есть каталог...

Как сделать автоматическую ротацию картинок в определенном месте страницы?
Мне необходимо, чтобы около 30 картинок сменяли друг друга каждые 1-2 секунды, без перезагрузки...

Открытие формы на нужной записи из другой формы, источником записи которой является запрос-объединение
В MS ACCESS есть ленточная форма Ф3, источником записей которой является запрос-объединение из двух...

Выполнить ротацию (сдвиг с переносом) 3-х первых элементов списка, если они не равны между собой, иначе удалить равные э
Никак не могу понять само задание,что от меня требует преподаватель, т.е что мне нужно...

Запрос n-ой записи из БД
Добрый день! я снова плутаю в 3-х соснах. у меня есть две таблички, в одной хранится информация...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru