Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Сложная сортировка выборки, нужна помощь  [new]
poiuytrewq
Member

Откуда:
Сообщений: 283
Добрый день,

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

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`)

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

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'),


Прошу помочь с запросом, всю голову сломал

Сообщение было отредактировано: 25 дек 19, 10:31
25 дек 19, 10:26    [22048231]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
poiuytrewq,

order by mark, time ?
25 дек 19, 10:32    [22048238]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Если отобрать записи с `type` = 2 и отсортировать их по возрастанию количества `mark`и по возрастанию `time` (в пределах одного `mark`), то выборка будет такая (fiddle):

id1id2marktypetimeupdateОбновлять?
1000141009022019-12-25 11:01:000yes
1000171009022019-12-25 11:04:000yes
1000191009022019-12-25 11:06:000no
1000121009022019-12-25 12:00:010no
2000211009022019-12-25 12:11:000no
1000151009122019-12-25 11:02:000yes
2000232009022019-12-25 12:13:000yes
2000242009122019-12-25 12:14:000yes
2000252009222019-12-25 12:15:000yes
3009073109022019-12-25 11:00:000yes
4009054109022019-12-25 11:00:000yes

А вот теперь подробно объясняйте, почему та или иная запись должна или не должна обновиться.

Сообщение было отредактировано: 25 дек 19, 11:30
25 дек 19, 11:28    [22048297]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
crutchmaster
Member

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

В этом тебе update не помощник. Загонять выборку в цикл, обновлять по одной.
25 дек 19, 11:34    [22048302]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 285
poiuytrewq,

я ничего не понял, сформулируй заново.
у тебя 11 записей с type = 2, а обновить надо 8. По какому правилу это надо сделать?
25 дек 19, 11:37    [22048309]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
crutchmaster
В этом тебе update не помощник. Загонять выборку в цикл, обновлять по одной.
Сфига бы? нормально всё обновляется... и не такие замороченные алгоритмы реализовывали. Правда, те были хотя бы понятные.
25 дек 19, 12:56    [22048383]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
Akina
crutchmaster
В этом тебе update не помощник. Загонять выборку в цикл, обновлять по одной.
Сфига бы? нормально всё обновляется... и не такие замороченные алгоритмы реализовывали. Правда, те были хотя бы понятные.

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

Update гарантирует порядок обновления?
25 дек 19, 13:01    [22048388]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
crutchmaster
Update гарантирует порядок обновления?
А на что он влияет - порядок обновления-то?

И да - запрос на обновление, в котором источником данных является одна таблица (коррелированные подзапросы не учитываются), при наличии предложения ORDER BY гарантирует порядок. Правда, не обновления (в каком порядке обновление пройдёт физически, определяют кэш блоков и дисковая подсистема), а порядок записей, для которых выполняется расчёт обновляемых значений. В частности, на этом основано использование локальных переменных в запросах на обновление. И это даже документировано - single-table UPDATE syntax содержит ORDER BY clause.

Сообщение было отредактировано: 25 дек 19, 13:38
25 дек 19, 13:37    [22048417]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
miksoft
Member

Откуда:
Сообщений: 37983
poiuytrewq
Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке:
а какая разница в каком порядке будут расставлены эти единички?
25 дек 19, 13:37    [22048418]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
poiuytrewq
Member

Откуда:
Сообщений: 283
Akina
А вот теперь подробно объясняйте, почему та или иная запись должна или не должна обновиться.


Ваша выборка не удовлетворяет условию, по возрастанию к-ва `mark`, возможно, я не точно выразился, но я привёл ожидаемый результат... записи, для которых к-во `mark` больше, должны быть ближе к окончанию выборки, тогда как в вашем примере, наоборот... поскольку записей в таблице больше, чем необходимо обновить, то, необходимо использовать оператор LIMIT, типа, UPDATE ... ORDER BY ... LIMIT 8 При этом, при сортировке записей по к-ву `mark`, порядок должен быть по возрастанию `time`
25 дек 19, 19:26    [22048756]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
poiuytrewq
Member

Откуда:
Сообщений: 283
miksoft
poiuytrewq
Необходимо обновить 8 записей (SET `update` = 1), где `type` = 2 в следующем порядке:
а какая разница в каком порядке будут расставлены эти единички?


Разница не в порядке единичек, просто в таблице большое количество записей, и, необходимо выбрать небольшую часть, и, именно в этом порядке
25 дек 19, 19:30    [22048760]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
poiuytrewq
возможно, я не точно выразился
Я бы сказал - лаконично до невменяемости.

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

Вот так: fiddle?
Если так - указывай ТОЧНО версию MySQL.

Сообщение было отредактировано: 25 дек 19, 22:13
25 дек 19, 22:08    [22048902]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 813
Akina
А на что он влияет - порядок обновления-то?

Да я откуда знаю. Может у ТСа там тригеры, которым это важно. Он не говорит ничего.
В любом случае на порядок операций надеяться не нужно.

Сообщение было отредактировано: 26 дек 19, 05:18
26 дек 19, 05:16    [22049061]     Ответить | Цитировать Сообщить модератору
 Re: Сложная сортировка выборки, нужна помощь  [new]
poiuytrewq
Member

Откуда:
Сообщений: 283
Akina,

спасибо, то, что нужно
26 дек 19, 11:56    [22049232]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить