Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная сортировка выборки, нужна помощь / 14 сообщений из 14, страница 1 из 1
25.12.2019, 10:26
    #39907757
poiuytrewq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
Добрый день,

имеется таблица с данными

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE `test_table` (
  `id1` int(11) NOT NULL,
  `id2` int(11) NOT NULL,
  `mark` int(11) NOT NULL,
  `type` tinyint(1) NOT NULL,
  `time` datetime NOT NULL,
  `update` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `test_table` (`id1`, `id2`, `mark`, `type`, `time`, `update`) VALUES
(10001, 1, 10090, 0, '2019-12-25 12:00:01', 0),
(10001, 2, 10090, 2, '2019-12-25 12:00:01', 0),
(10001, 3, 10090, 0, '2019-12-25 11:00:00', 0),
(10001, 4, 10090, 2, '2019-12-25 11:01:00', 0),
(10001, 5, 10091, 2, '2019-12-25 11:02:00', 0),
(10001, 6, 10092, 0, '2019-12-25 11:03:00', 0),
(10001, 7, 10090, 2, '2019-12-25 11:04:00', 0),
(10001, 8, 10090, 0, '2019-12-25 11:05:00', 0),
(10001, 9, 10090, 2, '2019-12-25 11:06:00', 0),
(20002, 1, 10090, 2, '2019-12-25 12:11:00', 0),
(20002, 2, 20090, 0, '2019-12-25 12:12:00', 0),
(20002, 3, 20090, 2, '2019-12-25 12:13:00', 0),
(20002, 4, 20091, 2, '2019-12-25 12:14:00', 0),
(20002, 5, 20092, 2, '2019-12-25 12:15:00', 0),
(30090, 7, 31090, 2, '2019-12-25 11:00:00', 0),
(40090, 5, 41090, 2, '2019-12-25 11:00:00', 0);

ALTER TABLE `test_table`
  ADD UNIQUE KEY `id` (`id1`,`id2`),
  ADD KEY `mark` (`mark`),
  ADD KEY `type` (`type`),
  ADD KEY `update` (`update`);
COMMIT;



Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке:

1. по возрастанию количества `mark`
2. по возрастанию `time` (в пределах одного `mark`)

В ожидаемом результате, должны обновиться следующие записи:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
1 (20002, 3, 20090, 2, '2019-12-25 12:13:00'),

2 (10001, 5, 10091, 2, '2019-12-25 11:02:00'),

3 (20002, 4, 20091, 2, '2019-12-25 12:14:00'),

4 (20002, 5, 20092, 2, '2019-12-25 12:15:00'),

5 (30090, 7, 31090, 2, '2019-12-25 11:00:00'),

6 (40090, 5, 41090, 2, '2019-12-25 11:00:00');

7 (10001, 4, 10090, 2, '2019-12-25 11:01:00'),
8 (10001, 7, 10090, 2, '2019-12-25 11:04:00'),



Прошу помочь с запросом, всю голову сломал
...
Рейтинг: 0 / 0
25.12.2019, 10:32
    #39907762
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
poiuytrewq,

order by mark, time ?
...
Рейтинг: 0 / 0
25.12.2019, 11:28
    #39907802
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
Если отобрать записи с `type` = 2 и отсортировать их по возрастанию количества `mark`и по возрастанию `time` (в пределах одного `mark`), то выборка будет такая ( fiddle ):

id1id2marktypetimeupdateОбновлять?1000141009022019-12-25 11:01:000yes1000171009022019-12-25 11:04:000yes1000191009022019-12-25 11:06:000no1000121009022019-12-25 12:00:010no2000211009022019-12-25 12:11:000no1000151009122019-12-25 11:02:000yes2000232009022019-12-25 12:13:000yes2000242009122019-12-25 12:14:000yes2000252009222019-12-25 12:15:000yes3009073109022019-12-25 11:00:000yes4009054109022019-12-25 11:00:000yes
А вот теперь подробно объясняйте, почему та или иная запись должна или не должна обновиться.
...
Рейтинг: 0 / 0
25.12.2019, 11:34
    #39907803
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
poiuytrewq
Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке

В этом тебе update не помощник. Загонять выборку в цикл, обновлять по одной.
...
Рейтинг: 0 / 0
25.12.2019, 11:37
    #39907809
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
poiuytrewq,

я ничего не понял, сформулируй заново.
у тебя 11 записей с type = 2, а обновить надо 8. По какому правилу это надо сделать?
...
Рейтинг: 0 / 0
25.12.2019, 12:56
    #39907857
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
crutchmaster
В этом тебе update не помощник. Загонять выборку в цикл, обновлять по одной.
Сфига бы? нормально всё обновляется... и не такие замороченные алгоритмы реализовывали. Правда, те были хотя бы понятные.
...
Рейтинг: 0 / 0
25.12.2019, 13:01
    #39907861
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
Akina
crutchmaster
В этом тебе update не помощник. Загонять выборку в цикл, обновлять по одной.
Сфига бы? нормально всё обновляется... и не такие замороченные алгоритмы реализовывали. Правда, те были хотя бы понятные.

Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке
порядке

Update гарантирует порядок обновления?
...
Рейтинг: 0 / 0
25.12.2019, 13:37
    #39907881
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
crutchmaster
Update гарантирует порядок обновления?
А на что он влияет - порядок обновления-то?

И да - запрос на обновление, в котором источником данных является одна таблица (коррелированные подзапросы не учитываются), при наличии предложения ORDER BY гарантирует порядок. Правда, не обновления (в каком порядке обновление пройдёт физически, определяют кэш блоков и дисковая подсистема), а порядок записей, для которых выполняется расчёт обновляемых значений. В частности, на этом основано использование локальных переменных в запросах на обновление. И это даже документировано - single-table UPDATE syntax содержит ORDER BY clause.
...
Рейтинг: 0 / 0
25.12.2019, 13:37
    #39907882
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
poiuytrewq
Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке:
а какая разница в каком порядке будут расставлены эти единички?
...
Рейтинг: 0 / 0
25.12.2019, 19:26
    #39908025
poiuytrewq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
Akina
А вот теперь подробно объясняйте, почему та или иная запись должна или не должна обновиться.


Ваша выборка не удовлетворяет условию, по возрастанию к-ва `mark`, возможно, я не точно выразился, но я привёл ожидаемый результат... записи, для которых к-во `mark` больше, должны быть ближе к окончанию выборки, тогда как в вашем примере, наоборот... поскольку записей в таблице больше, чем необходимо обновить, то, необходимо использовать оператор LIMIT, типа, UPDATE ... ORDER BY ... LIMIT 8 При этом, при сортировке записей по к-ву `mark`, порядок должен быть по возрастанию `time`
...
Рейтинг: 0 / 0
25.12.2019, 19:30
    #39908028
poiuytrewq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
miksoft
poiuytrewq
Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке:
а какая разница в каком порядке будут расставлены эти единички?


Разница не в порядке единичек, просто в таблице большое количество записей, и, необходимо выбрать небольшую часть, и, именно в этом порядке
...
Рейтинг: 0 / 0
25.12.2019, 22:08
    #39908114
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
poiuytrewq
возможно, я не точно выразился
Я бы сказал - лаконично до невменяемости.

poiuytrewq
я привёл ожидаемый результат...
От тебя просят ОБЪЯСНЕНИЯ, ПОЧЕМУ ТАК.
poiuytrewq
записи, для которых к-во `mark` больше, должны быть ближе к окончанию выборки, тогда как в вашем примере, наоборот
Общее количество записей с одинаковым `mark` во всей таблице, что ли?

Вот так: fiddle ?
Если так - указывай ТОЧНО версию MySQL.
...
Рейтинг: 0 / 0
26.12.2019, 05:16
    #39908247
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
Akina
А на что он влияет - порядок обновления-то?

Да я откуда знаю. Может у ТСа там тригеры, которым это важно. Он не говорит ничего.
В любом случае на порядок операций надеяться не нужно.
...
Рейтинг: 0 / 0
26.12.2019, 11:56
    #39908365
poiuytrewq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка выборки, нужна помощь
Akina,

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


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