Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql update каждой отдельной группы / 20 сообщений из 20, страница 1 из 1
15.01.2018, 10:50
    #39584227
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Мое знакомство с MySql всего несколько дней, потому, кажется мне что сам не смогу справиться с поставленной задачей.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
    group 
FROM
    new 
WHERE
    status = '0'
GROUP BY
    group 
LIMIT 1



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

Код: sql
1.
2.
UPDATE new 
SET status = '1'



Собственно, как прикрутить этот UPDATE к выше выложенному коду?
...
Рейтинг: 0 / 0
15.01.2018, 11:03
    #39584239
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE new `table`, ( SELECT `group`
                      FROM new 
                      WHERE status = '0'
                      GROUP BY `group`
                      LIMIT 1
                    ) subquery
SET status = '1'
WHERE `table`.`group` = subquery.`group`



Но вообще всё - безобразно. Мало того, что в качестве имени поля используется зарезервированное слово, так ещё и делается упор на неявную сортировку.
...
Рейтинг: 0 / 0
15.01.2018, 12:02
    #39584286
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Да хоть такое решение, главное что работает. Я так понял создается временная таблица table? Не совсем понял как работает данный запрос, но главное что выполняется коррерктно)
И еще вопрос, данный код, можно ли использовать LOCK, как он себя поведет в работе, или должно быть всё отлично? ))
...
Рейтинг: 0 / 0
15.01.2018, 12:04
    #39584290
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
meyuiможно ли использовать LOCKГде именно? И зачем?
...
Рейтинг: 0 / 0
15.01.2018, 12:22
    #39584308
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Вот так к примеру:
LOCK TABLES new_users WRITE;
UPDATE new `table`, ( SELECT `group`
FROM new
WHERE status = '0'
GROUP BY `group`
LIMIT 1
) subquery
SET status = '1'
WHERE `table`.`group` = subquery.`group`
UNLOCK TABLES;

Это нужно для многопотока
...
Рейтинг: 0 / 0
15.01.2018, 12:32
    #39584315
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
С LOCK работать не хочет, ставил запетые в разных местах, не помогло. А без него, увы, никак(
...
Рейтинг: 0 / 0
15.01.2018, 12:33
    #39584316
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Лочить одну таблицу ради обновления другой - это сильно!
Но если это проделать с одной таблицей - получишь отказ (ERROR 1100 (HY000): Table '`table`' was not locked with LOCK TABLES).
...
Рейтинг: 0 / 0
15.01.2018, 12:39
    #39584321
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Да, сила, еще какая)))) Ну а как сделать? Моих знаний не хватит для этого. Да, запрос получится адский, ну что делать? Надеюсь MyS`l жить будет))))
...
Рейтинг: 0 / 0
15.01.2018, 12:41
    #39584327
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
meyuiДа, сила, еще какая)))) Ну а как сделать? Моих знаний не хватит для этого. Да, запрос получится адский, ну что делать? Надеюсь MyS`l жить будет))))

Извиняюсь за ошибки, + нажимаю на ответ, а нужно было выбрать цитировать. Имеется ввиду код адский, но сервер жить будет)
...
Рейтинг: 0 / 0
15.01.2018, 13:07
    #39584348
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
meyui , я думаю, что правильнее будет озвучить задачу, а не свои попытки её решить. И показывать истинные данные (DDL и пр.), а не модельки.
...
Рейтинг: 0 / 0
15.01.2018, 13:45
    #39584398
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Akina meyui , я думаю, что правильнее будет озвучить задачу, а не свои попытки её решить. И показывать истинные данные (DDL и пр.), а не модельки.

Ниже 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

Надеюсь, понятно объяснил? Только обязательно запрос нужно лочить.
...
Рейтинг: 0 / 0
15.01.2018, 14:18
    #39584422
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Это опять попытка решить, а не постановка задачи.
Какова цель всего этого мероприятия?

Но если не желаете раскрывать... как я понимаю, это выполняется из некоей клиентской программы, каковых работает несколько. А лок нужен для того, чтобы именно эта копия программы выполнила обновление... но зачем? какая разница, какая копия это сделает? всё равно в итоговом состоянии на приведённых данных нет возможности определить, какая из копий выполнила обновление.
...
Рейтинг: 0 / 0
15.01.2018, 14:43
    #39584451
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
AkinaЭто опять попытка решить, а не постановка задачи.
Какова цель всего этого мероприятия?

Но если не желаете раскрывать... как я понимаю, это выполняется из некоей клиентской программы, каковых работает несколько. А лок нужен для того, чтобы именно эта копия программы выполнила обновление... но зачем? какая разница, какая копия это сделает? всё равно в итоговом состоянии на приведённых данных нет возможности определить, какая из копий выполнила обновление.
И опять я прогадал с возможными вопросами... Смотрите... выполняется 100 обращений к базе данных, 2 из которых взяли один и тот же id, проблема не в том какой экземпляр поменяет статус, проблема в том, что с этим самым id нужно проделать только одну операцию, а оказывается, 2 обращения проделают тоже самое, что недопустимо. А статус меняется для того, чтобы для последующих действий было понятно, что с этим id уже были произведены манипуляции и в дальнейшем с этим id работать не нужно. Иными словами, если 2 обращения взяли один и тот же id в одну и ту же секунду, то произойдут две однотипные операции.

Колонка с id меняется, добавляются новые id. Статус меняется только для того чтобы в последующих попытках не то, над чем уже было проделано действие. Повторное выполнение однотипной операции над старыми данными производится к примеру в заданные промежутки времени, и потом, естественно статус опять меняется, чтобы можно было повторно выполнить то, что требуется. То что данное выполняется в клиентской программе, это так, но тестирую sql запросы в Navicat.
...
Рейтинг: 0 / 0
15.01.2018, 15:00
    #39584467
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
meyui2 из которых взяли один и тот же id, проблема не в том какой экземпляр поменяет статус, проблема в том, что с этим самым id нужно проделать только одну операцию, а оказывается, 2 обращения проделают тоже самое, что недопустимо. А статус меняется для того, чтобы для последующих действий было понятно, что с этим id уже были произведены манипуляции и в дальнейшем с этим id работать не нужно. Иными словами, если 2 обращения взяли один и тот же id в одну и ту же секунду, то произойдут две однотипные операции.
Да всего-то и нужно, что после UPDATE получить affected rows. Первый клиент, кто собственно выполнил обновление, получит количество записей, которые он обновил и которые должен обработать. Второй - получит ноль, потому что affected rows возвращает количество реально изменившихся, а не количество отобранных для изменения, записей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mysql> create table test (id int);
Query OK, 0 rows affected (0.73 sec)

mysql> insert into test select 1;
Query OK, 1 row affected (0.13 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> update test set id=2;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update test set id=2;
Query OK, 0 rows affected (0.03 sec)
Rows matched: 1  Changed: 0  Warnings: 0
...
Рейтинг: 0 / 0
15.01.2018, 15:41
    #39584519
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
AkinaДа всего-то и нужно
При записи и при апдейте да, так и будет, а вы еще не учли момент что мне сначала нужно получить этот id, а получить тольк оодин экземпляр без лока не получится. Вот в чем загвоздка - проще простого...
...
Рейтинг: 0 / 0
15.01.2018, 16:10
    #39584552
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
meyuiмне сначала нужно получить этот idГДЕ это написано выше?
SELECT ... FOR UPDATE.
...
Рейтинг: 0 / 0
15.01.2018, 16:15
    #39584556
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Akinameyuiмне сначала нужно получить этот idГДЕ это написано выше?
SELECT ... FOR UPDATE.
Вы писал Нам нужно получить только один экземпляр id
ну уж извините что не указал про select. сори..
...
Рейтинг: 0 / 0
15.01.2018, 16:23
    #39584569
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Упс, получается, update перезаписывает ответ и тогда мы его теряем? Если так, то можно записать ответ select в локальную переменную, а после update её вывести? Програмный софт возвращает ответ после получения select, а я получается если и update туда прикручу то ответ потеряется... Ясно... Фиг с ним, буду решать как как с утра думал, создается еще одна таблица и туда где будут стоять те самые id без дубликатов, вытаскивать будем с локом и менять статус. Вижу данная затея что мы решаем не стоит таких свеч. Ладно, спасибо что помогали отличный форум. Спасибо вам что уделили время на дискуссию. Спасибо ))
...
Рейтинг: 0 / 0
15.01.2018, 16:39
    #39584585
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
Никогда не видел чтобы девушки увлекались программированием, - это нечто ))
...
Рейтинг: 0 / 0
16.01.2018, 13:23
    #39585059
meyui
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql update каждой отдельной группы
meyui,

Как всегда решил сам. Не нужно ничего перебирать внутри UPDATE как в вашем случае, хотя, он все равно мне не подошел. И да, то что LOCK в вашем случае не нужен, это я понял т.к. всё выполняется внутри конструкции UPDATE.

Всё намного проще - пару минут уделил поиском, по сравнению с вчерашним днем, где на двух SQL мега форумах, видители, не смогли мне помочь, а задача проще простого.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql update каждой отдельной группы / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]