SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.01.2018 09:40:34

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

mysql update каждой отдельной группы

Мое знакомство с MySql всего несколько дней, потому, кажется мне что сам не смогу справиться с поставленной задачей.

SELECT
    group
FROM
    new
WHERE
    status = '0'
GROUP BY
    group
LIMIT 1

Этот код выводит по одной группе, каждая группа имеет несколько полей.
Как только мы получили номер одной из групп, нужно изменить значение всех полей данной группы на status = '1', не затрагивая остальные группы.

UPDATE new
SET status = '1'

Собственно, как прикрутить этот UPDATE к выше выложенному коду?

Отредактированно meyui (15.01.2018 09:43:29)

Неактивен

 

#2 15.01.2018 10:46:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5673

Re: mysql update каждой отдельной группы

Активен

 

#3 15.01.2018 11:02:14

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

vasya написал:

https://sqlinfo.ru/articles/info/19.html

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

Неактивен

 

#4 15.01.2018 11:04:36

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 400

Re: mysql update каждой отдельной группы

UPDATE new
SET status = '1'
WHERE `group` = @group
где @group имя группы, которую получили запросом.

Отредактированно klow (15.01.2018 11:04:49)

Неактивен

 

#5 15.01.2018 11:05:46

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

По ссылке что вы дали, я так понял update использовать одновременно невозможно. А как насчет prepared statement? Про это нашел в интернете. А значит решение должно быть. Мне не важно с update или нет, мне нужно само решение.

Неактивен

 

#6 15.01.2018 11:11:07

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

klow написал:

UPDATE new
SET status = '1'
WHERE `group` = @group
где @group имя группы, которую получили запросом.

Извиняюсь за глупые вопросы, но как получить имя группы?

Неактивен

 

#7 15.01.2018 11:13:15

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 400

Re: mysql update каждой отдельной группы

Приехали. sad Вы же сами написали!?

SELECT
    group
FROM
    new
WHERE
    status = '0'
GROUP BY
    group
LIMIT 1
Или Вы хотите одним запросом все сделать?

Неактивен

 

#8 15.01.2018 11:14:59

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

SELECT
    group
FROM
    new
WHERE
    STATUS = 1
GROUP BY
    group
    LIMIT 1;

UPDATE new
SET status = '0'
WHERE `group` = @group;


Если делаю так то ничего не выходит, статус не меняется.

Неактивен

 

#9 15.01.2018 11:15:31

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

klow написал:

Или Вы хотите одним запросом все сделать?

Ага, вот именно)

Неактивен

 

#10 15.01.2018 11:18:47

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

Будет использоваться LOCK, потому, наверное, придется делать всё в одном запросе

Неактивен

 

#11 15.01.2018 11:21:37

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 400

Re: mysql update каждой отдельной группы

А почему только одной произвольной группы? Почему не двух, трех или всех?

Неактивен

 

#12 15.01.2018 11:50:23

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

klow написал:

А почему только одной произвольной группы? Почему не двух, трех или всех?

На удаленном сервере есть папки ID групп, в каждой группе есть поля. Мы удалено выполняем условие только для определённого ID, а удалённый сервер уже делает свою работу, только в рамках той группы, которую мы ему отправили. Такой процесс выполняется последовательно, пока в таблице не закончатся ID групп. Точнее пока status не будет изменен для всех групп. Спустя сутки, всё автоматически будет вестись мониторинг в автоматическом режиме, и когда время придёт, те же самые операции нужно будет проделать повторно, но опять же, всё на автомате.

Статус нужно менять в локе, и, скорее всего в одном запросе, чтобы второй поток случайно не внедрился и не выполнил одно и то же действие. Буду очень признателен за решения моей проблемы.

Неактивен

 

#13 15.01.2018 11:54:07

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 400

Re: mysql update каждой отдельной группы

meyui написал:

только в рамках той группы, которую мы ему отправили.

И где это? Согласно скрипта произвольная группа.
Если знаете группу то используйте

UPDATE new
SET status = '0'
WHERE `group` = @group;

Неактивен

 

#14 15.01.2018 12:18:29

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

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)

Неактивен

 

#15 15.01.2018 12:20:54

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 400

Re: mysql update каждой отдельной группы

@group - это переменная! Если хотите ставить значение, то нужно
UPDATE new_users
SET status = '0'
WHERE `id_group` = 18832;

Неактивен

 

#16 15.01.2018 12:26:12

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

klow написал:

@group - это переменная! Если хотите ставить значение, то нужно
UPDATE new_users
SET status = '0'
WHERE `id_group` = 18832;

Спасибо, так работает, ну а если в один запрос, как быть?

Неактивен

 

#17 15.01.2018 12:27:58

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

Или можно как то получить этот номер присвоить его переменной в одном запросе, а далее эту переменную апдейтим, в том же потоке. Так не получится?

Отредактированно meyui (15.01.2018 12:28:25)

Неактивен

 

#18 15.01.2018 12:36:28

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

Как тут можно 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`

Отредактированно meyui (15.01.2018 12:36:54)

Неактивен

 

#19 15.01.2018 12:58:36

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

klow написал:

@group - это переменная! Если хотите ставить значение, то нужно

Выше отписал. Далее...
.............
Неужели такая сложная задача?????

Неактивен

 

#20 15.01.2018 13:16:14

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 400

Re: mysql update каждой отдельной группы

Я вообще ничего сложно не вижу. Проблема в другом. Задача, что нужно сделать - непонятна, не формализована.
По крайней мере для меня. Попробуйте ее изложить последовательно и максимально точно (формализовано).

Неактивен

 

#21 15.01.2018 13:36:57

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

Хорошо. Ниже 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)

Неактивен

 

#22 15.01.2018 14:26:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5673

Re: mysql update каждой отдельной группы

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  не нужен

Активен

 

#23 15.01.2018 15:12:34

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

vasya написал:

LOCK  не нужен

Значит я виноват что забыл еще сказать про элементарные вещи, простите... Имеем 100 обращений к базе данных, 2 из которых сработали в одну и ту же секунду. Проблема не в том какой экземпляр поменяет статус, проблема вот в чем: получили id, проделали с ним 2, 5, 10 и более однотипных действий, а нужно всего одно! С каждым id мы должны проделать только одно действие. Статус присутствует в таблице только с одной целю: чтобы через определённый промежуток времени его поменять, чтобы наша клиентская программа повторно смогла работать с id, статус которых 0 или 1 к примеру. Таблица пополняется новыми данными, старые данные с id также время от времени должны перевыполняться. Почему собственно и нужен LOCK, ведь без него, к примеру, - операция над id 2945935 выполнится несколько раз, что недопустимо.

Неактивен

 

#24 16.01.2018 11:19:32

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

Ну по идее если select находится внутри update, то LOCK не нужен, это я уже понял. Но софт который я использую, не возвращает значение select (id), а вот если через NAVICAT тестировать то select значение id выводится. Может есть еще какие нибудь подсказки, что сменить или переменную прикрутить вконец, чтобы мой программный софт выводил значение select? Другие запросы где использую select он выводит, но код что выше, значение не возвращается.

Хотя бы наводку дайте, дальше буду изучать сам. Спасибо за ответы.

Отредактированно meyui (16.01.2018 11:20:53)

Неактивен

 

#25 16.01.2018 13:27:55

meyui
Участник
Зарегистрирован: 15.01.2018
Сообщений: 17

Re: mysql update каждой отдельной группы

klow написал:

Я вообще ничего сложно не вижу.

Вы ничего сложного не видите, но даете мне понять что тут ВСЁ СЛОЖНО и мне нужно кинуть затею. Спасибо за такую помощь.

Как всегда решил проблему сам. Всё намного проще - пару минут уделил поиском, по сравнению с вчерашним днем, где на двух SQL мега форумах посвященных чисто MySql, видители, не смогли мне помочь, а задача проще простого и решается двумя строчками sql в одном запросе.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson