Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Мое знакомство с MySql всего несколько дней, потому, кажется мне что сам не смогу справиться с поставленной задачей. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Этот код выводит по одной группе, каждая группа имеет несколько полей. Как только мы получили номер одной из групп, нужно изменить значение всех полей данной группы на status = '1', не затрагивая остальные группы. Код: sql 1. 2. Собственно, как прикрутить этот UPDATE к выше выложенному коду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 10:50 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Но вообще всё - безобразно. Мало того, что в качестве имени поля используется зарезервированное слово, так ещё и делается упор на неявную сортировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 11:03 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Да хоть такое решение, главное что работает. Я так понял создается временная таблица table? Не совсем понял как работает данный запрос, но главное что выполняется коррерктно) И еще вопрос, данный код, можно ли использовать LOCK, как он себя поведет в работе, или должно быть всё отлично? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:02 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
meyuiможно ли использовать LOCKГде именно? И зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:04 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Вот так к примеру: 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; Это нужно для многопотока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:22 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
С LOCK работать не хочет, ставил запетые в разных местах, не помогло. А без него, увы, никак( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:32 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Лочить одну таблицу ради обновления другой - это сильно! Но если это проделать с одной таблицей - получишь отказ (ERROR 1100 (HY000): Table '`table`' was not locked with LOCK TABLES). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:33 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Да, сила, еще какая)))) Ну а как сделать? Моих знаний не хватит для этого. Да, запрос получится адский, ну что делать? Надеюсь MyS`l жить будет)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:39 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
meyuiДа, сила, еще какая)))) Ну а как сделать? Моих знаний не хватит для этого. Да, запрос получится адский, ну что делать? Надеюсь MyS`l жить будет)))) Извиняюсь за ошибки, + нажимаю на ответ, а нужно было выбрать цитировать. Имеется ввиду код адский, но сервер жить будет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 12:41 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
meyui , я думаю, что правильнее будет озвучить задачу, а не свои попытки её решить. И показывать истинные данные (DDL и пр.), а не модельки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 13:07 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
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 Надеюсь, понятно объяснил? Только обязательно запрос нужно лочить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 13:45 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Это опять попытка решить, а не постановка задачи. Какова цель всего этого мероприятия? Но если не желаете раскрывать... как я понимаю, это выполняется из некоей клиентской программы, каковых работает несколько. А лок нужен для того, чтобы именно эта копия программы выполнила обновление... но зачем? какая разница, какая копия это сделает? всё равно в итоговом состоянии на приведённых данных нет возможности определить, какая из копий выполнила обновление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 14:18 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
AkinaЭто опять попытка решить, а не постановка задачи. Какова цель всего этого мероприятия? Но если не желаете раскрывать... как я понимаю, это выполняется из некоей клиентской программы, каковых работает несколько. А лок нужен для того, чтобы именно эта копия программы выполнила обновление... но зачем? какая разница, какая копия это сделает? всё равно в итоговом состоянии на приведённых данных нет возможности определить, какая из копий выполнила обновление. И опять я прогадал с возможными вопросами... Смотрите... выполняется 100 обращений к базе данных, 2 из которых взяли один и тот же id, проблема не в том какой экземпляр поменяет статус, проблема в том, что с этим самым id нужно проделать только одну операцию, а оказывается, 2 обращения проделают тоже самое, что недопустимо. А статус меняется для того, чтобы для последующих действий было понятно, что с этим id уже были произведены манипуляции и в дальнейшем с этим id работать не нужно. Иными словами, если 2 обращения взяли один и тот же id в одну и ту же секунду, то произойдут две однотипные операции. Колонка с id меняется, добавляются новые id. Статус меняется только для того чтобы в последующих попытках не то, над чем уже было проделано действие. Повторное выполнение однотипной операции над старыми данными производится к примеру в заданные промежутки времени, и потом, естественно статус опять меняется, чтобы можно было повторно выполнить то, что требуется. То что данное выполняется в клиентской программе, это так, но тестирую sql запросы в Navicat. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 14:43 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 15:00 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
AkinaДа всего-то и нужно При записи и при апдейте да, так и будет, а вы еще не учли момент что мне сначала нужно получить этот id, а получить тольк оодин экземпляр без лока не получится. Вот в чем загвоздка - проще простого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 15:41 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
meyuiмне сначала нужно получить этот idГДЕ это написано выше? SELECT ... FOR UPDATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:10 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Akinameyuiмне сначала нужно получить этот idГДЕ это написано выше? SELECT ... FOR UPDATE. Вы писал Нам нужно получить только один экземпляр id ну уж извините что не указал про select. сори.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:15 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Упс, получается, update перезаписывает ответ и тогда мы его теряем? Если так, то можно записать ответ select в локальную переменную, а после update её вывести? Програмный софт возвращает ответ после получения select, а я получается если и update туда прикручу то ответ потеряется... Ясно... Фиг с ним, буду решать как как с утра думал, создается еще одна таблица и туда где будут стоять те самые id без дубликатов, вытаскивать будем с локом и менять статус. Вижу данная затея что мы решаем не стоит таких свеч. Ладно, спасибо что помогали отличный форум. Спасибо вам что уделили время на дискуссию. Спасибо )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:23 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
Никогда не видел чтобы девушки увлекались программированием, - это нечто )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:39 |
|
||
|
mysql update каждой отдельной группы
|
|||
|---|---|---|---|
|
#18+
meyui, Как всегда решил сам. Не нужно ничего перебирать внутри UPDATE как в вашем случае, хотя, он все равно мне не подошел. И да, то что LOCK в вашем случае не нужен, это я понял т.к. всё выполняется внутри конструкции UPDATE. Всё намного проще - пару минут уделил поиском, по сравнению с вчерашним днем, где на двух SQL мега форумах, видители, не смогли мне помочь, а задача проще простого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2018, 13:23 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39584286&tid=1830118]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 376ms |

| 0 / 0 |
