Задавайте вопросы, мы ответим
Вы не зашли.
Мое знакомство с MySql всего несколько дней, потому, кажется мне что сам не смогу справиться с поставленной задачей.
Отредактированно meyui (15.01.2018 09:43:29)
Неактивен
Неактивен
vasya написал:
https://sqlinfo.ru/articles/info/19.html
Спасибо, однозначно будет полезно, но на данный момент решение нужно именно сейчас, так как вся работа встала на этом.
По ссылке что вы дали, поверхностно глянул, там про группы вообще ничего нет, нужно вникать, а решение нужно уже сейчас.
Мне ни сколько уроки нужны, сколько само решение.
Неактивен
Отредактированно klow (15.01.2018 11:04:49)
Неактивен
По ссылке что вы дали, я так понял update использовать одновременно невозможно. А как насчет prepared statement? Про это нашел в интернете. А значит решение должно быть. Мне не важно с update или нет, мне нужно само решение.
Неактивен
klow написал:
UPDATE newгде @group имя группы, которую получили запросом.
SET status = '1'
WHERE `group` = @group
Извиняюсь за глупые вопросы, но как получить имя группы?
Неактивен
Приехали. Вы же сами написали!?
Неактивен
Неактивен
klow написал:
Или Вы хотите одним запросом все сделать?
Ага, вот именно)
Неактивен
Будет использоваться LOCK, потому, наверное, придется делать всё в одном запросе
Неактивен
А почему только одной произвольной группы? Почему не двух, трех или всех?
Неактивен
klow написал:
А почему только одной произвольной группы? Почему не двух, трех или всех?
На удаленном сервере есть папки ID групп, в каждой группе есть поля. Мы удалено выполняем условие только для определённого ID, а удалённый сервер уже делает свою работу, только в рамках той группы, которую мы ему отправили. Такой процесс выполняется последовательно, пока в таблице не закончатся ID групп. Точнее пока status не будет изменен для всех групп. Спустя сутки, всё автоматически будет вестись мониторинг в автоматическом режиме, и когда время придёт, те же самые операции нужно будет проделать повторно, но опять же, всё на автомате.
Статус нужно менять в локе, и, скорее всего в одном запросе, чтобы второй поток случайно не внедрился и не выполнил одно и то же действие. Буду очень признателен за решения моей проблемы.
Неактивен
meyui написал:
только в рамках той группы, которую мы ему отправили.
И где это? Согласно скрипта произвольная группа.
Если знаете группу то используйте
Неактивен
klow написал:
meyui написал:
только в рамках той группы, которую мы ему отправили.
И где это? Согласно скрипта произвольная группа.
Если знаете группу то используйтеUPDATE new
SET status = '0'
WHERE `group` = @group;
UPDATE new_users
SET status = '0'
WHERE `id_group` = @18832;
Ошибок нет, статус как был 0, так и остался.
---------------
Так не работает, это был номер группы. А заню ли я номер группы по идее?
Хорошо, постараюсь кратко описать ситуацию. Произвольную группу знаю не я, а программное обеспечение, которое выполняется в многопотоке. Каждый поток берет группу, меняет статус на 0. Группы могут добавляться новые, а старые могут удаляться. Я этого номера не знаю. Мне для номера допустим 18832 который находится в колонке group, нужно во всех полях колонки status, поменять значение полей на 0, но только для этого номера. Надеюсь так понятно? Извините если что не так объяснил
Отредактированно meyui (15.01.2018 12:20:15)
Неактивен
@group - это переменная! Если хотите ставить значение, то нужно
UPDATE new_users
SET status = '0'
WHERE `id_group` = 18832;
Неактивен
klow написал:
@group - это переменная! Если хотите ставить значение, то нужно
UPDATE new_users
SET status = '0'
WHERE `id_group` = 18832;
Спасибо, так работает, ну а если в один запрос, как быть?
Неактивен
Или можно как то получить этот номер присвоить его переменной в одном запросе, а далее эту переменную апдейтим, в том же потоке. Так не получится?
Отредактированно meyui (15.01.2018 12:28:25)
Неактивен
Как тут можно LOCK прикрутить?
Отредактированно meyui (15.01.2018 12:36:54)
Неактивен
klow написал:
@group - это переменная! Если хотите ставить значение, то нужно
Выше отписал. Далее...
.............
Неужели такая сложная задача?????
Неактивен
Я вообще ничего сложно не вижу. Проблема в другом. Задача, что нужно сделать - непонятна, не формализована.
По крайней мере для меня. Попробуйте ее изложить последовательно и максимально точно (формализовано).
Неактивен
Хорошо. Ниже 3 колонки для примера:
status|login|id
0| nik1|3647
0| nik2|3647
0| nik4|3982
0| nik5|3982
0| nik6|3982
0| nik6|3847
Как видим id повторяется. Нам нужно получить только один экземпляр id, если он повторяется, или вовсе не повторяется - не важно. 3982 к примеру. Получили, затем поменяли status на 1 той группы id, которую мы получили. Визуально таблица будет выглядеть уже так:
status|login|id
0| nik1|3647
0| nik2|3647
1| nik4|3982
1| nik5|3982
1| nik6|3982
0| nik6|3847
Возможно все таки не так объяснил, говорили за группы и друг друга наверное не так поняли что за группы. Ну уж извините, буду стараться в следующий раз всё чётко и кратко излагать)
Отредактированно meyui (15.01.2018 13:42:53)
Неактивен
meyui написал:
Как тут можно LOCK прикрутить?
LOCK TABLES new WRITE;
............
UNLOCK TABLES;
К этому запросу:UPDATE new `table`, ( SELECT `group`
FROM new
WHERE status = '0'
GROUP BY `group`
LIMIT 1
) subquery
SET status = '1'
WHERE `table`.`group` = subquery.`group`
LOCK не нужен
Неактивен
vasya написал:
LOCK не нужен
Значит я виноват что забыл еще сказать про элементарные вещи, простите... Имеем 100 обращений к базе данных, 2 из которых сработали в одну и ту же секунду. Проблема не в том какой экземпляр поменяет статус, проблема вот в чем: получили id, проделали с ним 2, 5, 10 и более однотипных действий, а нужно всего одно! С каждым id мы должны проделать только одно действие. Статус присутствует в таблице только с одной целю: чтобы через определённый промежуток времени его поменять, чтобы наша клиентская программа повторно смогла работать с id, статус которых 0 или 1 к примеру. Таблица пополняется новыми данными, старые данные с id также время от времени должны перевыполняться. Почему собственно и нужен LOCK, ведь без него, к примеру, - операция над id 2945935 выполнится несколько раз, что недопустимо.
Неактивен
Ну по идее если select находится внутри update, то LOCK не нужен, это я уже понял. Но софт который я использую, не возвращает значение select (id), а вот если через NAVICAT тестировать то select значение id выводится. Может есть еще какие нибудь подсказки, что сменить или переменную прикрутить вконец, чтобы мой программный софт выводил значение select? Другие запросы где использую select он выводит, но код что выше, значение не возвращается.
Хотя бы наводку дайте, дальше буду изучать сам. Спасибо за ответы.
Отредактированно meyui (16.01.2018 11:20:53)
Неактивен
klow написал:
Я вообще ничего сложно не вижу.
Вы ничего сложного не видите, но даете мне понять что тут ВСЁ СЛОЖНО и мне нужно кинуть затею. Спасибо за такую помощь.
Как всегда решил проблему сам. Всё намного проще - пару минут уделил поиском, по сравнению с вчерашним днем, где на двух SQL мега форумах посвященных чисто MySql, видители, не смогли мне помочь, а задача проще простого и решается двумя строчками sql в одном запросе.
Неактивен