powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql update каждой отдельной группы
20 сообщений из 20, страница 1 из 1
mysql update каждой отдельной группы
    #39584227
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мое знакомство с 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
mysql update каждой отдельной группы
    #39584239
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
mysql update каждой отдельной группы
    #39584286
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да хоть такое решение, главное что работает. Я так понял создается временная таблица table? Не совсем понял как работает данный запрос, но главное что выполняется коррерктно)
И еще вопрос, данный код, можно ли использовать LOCK, как он себя поведет в работе, или должно быть всё отлично? ))
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584290
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meyuiможно ли использовать LOCKГде именно? И зачем?
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584308
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так к примеру:
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
mysql update каждой отдельной группы
    #39584315
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С LOCK работать не хочет, ставил запетые в разных местах, не помогло. А без него, увы, никак(
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584316
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лочить одну таблицу ради обновления другой - это сильно!
Но если это проделать с одной таблицей - получишь отказ (ERROR 1100 (HY000): Table '`table`' was not locked with LOCK TABLES).
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584321
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, сила, еще какая)))) Ну а как сделать? Моих знаний не хватит для этого. Да, запрос получится адский, ну что делать? Надеюсь MyS`l жить будет))))
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584327
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
meyuiДа, сила, еще какая)))) Ну а как сделать? Моих знаний не хватит для этого. Да, запрос получится адский, ну что делать? Надеюсь MyS`l жить будет))))

Извиняюсь за ошибки, + нажимаю на ответ, а нужно было выбрать цитировать. Имеется ввиду код адский, но сервер жить будет)
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584348
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meyui , я думаю, что правильнее будет озвучить задачу, а не свои попытки её решить. И показывать истинные данные (DDL и пр.), а не модельки.
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584398
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
mysql update каждой отдельной группы
    #39584422
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это опять попытка решить, а не постановка задачи.
Какова цель всего этого мероприятия?

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

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

Колонка с id меняется, добавляются новые id. Статус меняется только для того чтобы в последующих попытках не то, над чем уже было проделано действие. Повторное выполнение однотипной операции над старыми данными производится к примеру в заданные промежутки времени, и потом, естественно статус опять меняется, чтобы можно было повторно выполнить то, что требуется. То что данное выполняется в клиентской программе, это так, но тестирую sql запросы в Navicat.
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584467
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
mysql update каждой отдельной группы
    #39584519
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaДа всего-то и нужно
При записи и при апдейте да, так и будет, а вы еще не учли момент что мне сначала нужно получить этот id, а получить тольк оодин экземпляр без лока не получится. Вот в чем загвоздка - проще простого...
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584552
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
meyuiмне сначала нужно получить этот idГДЕ это написано выше?
SELECT ... FOR UPDATE.
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584556
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinameyuiмне сначала нужно получить этот idГДЕ это написано выше?
SELECT ... FOR UPDATE.
Вы писал Нам нужно получить только один экземпляр id
ну уж извините что не указал про select. сори..
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584569
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс, получается, update перезаписывает ответ и тогда мы его теряем? Если так, то можно записать ответ select в локальную переменную, а после update её вывести? Програмный софт возвращает ответ после получения select, а я получается если и update туда прикручу то ответ потеряется... Ясно... Фиг с ним, буду решать как как с утра думал, создается еще одна таблица и туда где будут стоять те самые id без дубликатов, вытаскивать будем с локом и менять статус. Вижу данная затея что мы решаем не стоит таких свеч. Ладно, спасибо что помогали отличный форум. Спасибо вам что уделили время на дискуссию. Спасибо ))
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39584585
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никогда не видел чтобы девушки увлекались программированием, - это нечто ))
...
Рейтинг: 0 / 0
mysql update каждой отдельной группы
    #39585059
meyui
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
meyui,

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

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


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