powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с логикой запроса
8 сообщений из 8, страница 1 из 1
Помогите с логикой запроса
    #40052099
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица test, 2 колонки key, value

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
key value
1 59456
1 34534
1 36
1 34754
1 3666
2 8342
2 68902
2 68
3 85273



Если количество count(value) для определенного key больше 2, то изменить значение value всех остальных на 0.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
key value
1 59456
1 34534
1 0
1 0
1 0
2 8342
2 68902
2 0
3 85273



Подскажите как это сделать.
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052103
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Укажите сортировку, которая определяет, что именно показанные записи являются "остальными" и должны быть "обнулены".
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052128
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сортировка не имеет значения. Нужно оставить 2 записи с их value, а все остальные обнулить по key.
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052188
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: sql
1.
update test, (select value from test where key=1 limit 2,999999) test1 set test.value=0 where test.key=test1.key and test.value=test1.value;



Вот примерно такой запрос должен быть для каждого key, но как сделат всё одним запросом?
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052249
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложите точный CREATE TABLE, пример данных в виде INSERT INTO, и всё же определите сортировку (например, оставить два наименьших).
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052384
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, мне просто нужен пример каким образом я могу это сделать. Мне не важная сортировка.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table test1 (`key` int, `value` int);

insert...

+-----+-------+
| key | value |
+-----+-------+
|   1 |     1 |
|   1 |    22 |
|   1 |   333 |
|   1 |  4444 |
|   1 | 55555 |
|   2 |    23 |
|   2 |   234 |
|   2 |  2345 |
|   3 |  2345 |
+-----+-------+



Нужного результата добился запросами

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
mysql> update test1, (select * from test1 where `key`=1 limit 2,999999) t set test1.value=0 where test1.`key`=t.`key` and test1.value=t.value;
Query OK, 3 rows affected
Rows matched: 3  Changed: 3  Warnings: 0

mysql> update test1, (select * from test1 where `key`=2 limit 2,999999) t set test1.value=0 where test1.`key`=t.`key` and test1.value=t.value;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update test1, (select * from test1 where `key`=3 limit 2,999999) t set test1.value=0 where test1.`key`=t.`key` and test1.value=t.value;
Query OK, 0 rows affected
Rows matched: 0  Changed: 0  Warnings: 0



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
+-----+-------+
| key | value |
+-----+-------+
|   1 |     1 |
|   1 |    22 |
|   1 |     0 |
|   1 |     0 |
|   1 |     0 |
|   2 |    23 |
|   2 |   234 |
|   2 |     0 |
|   3 |  2345 |
+-----+-------+



Допустим, key в таблице тысячи. Не буду же я для каждого писать отдельный запрос.
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052413
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
UPDATE test
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY `key` ORDER BY `value`) rn
      FROM test) test1 USING (`key`,`value`)
SET test.value = 0
WHERE test1.rn > 2;



fiddle

Для версии 5.x - использовать, например, эмуляцию на базе переменных, см. FAQ: Нумерация строк и другие вопросы про использование переменных .
...
Рейтинг: 0 / 0
Помогите с логикой запроса
    #40052420
andrey10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Код: sql
1.
2.
3.
4.
5.
UPDATE test
JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY `key` ORDER BY `value`) rn
      FROM test) test1 USING (`key`,`value`)
SET test.value = 0
WHERE test1.rn > 2;



fiddle

Для версии 5.x - использовать, например, эмуляцию на базе переменных, см. FAQ: Нумерация строк и другие вопросы про использование переменных .


Пожалуйста, покажите пример для 5. версии. Не знаю как заменить OVER, PARTITION. Груп бай? Как-то не выходит.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с логикой запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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