Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / При SELECT LIMIT есть повторения / 12 сообщений из 12, страница 1 из 1
26.01.2022, 09:11
    #40129459
hibinyru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
Всем привет. что-то у меня глюк с сортировкой в mysql, не могу понять что не так:

есть 2 запроса :

SELECT id FROM 2020_medicine WHERE id_region=1 AND status=1 ORDER BY rate_summ DESC LIMIT 0,12;

SELECT id FROM 2020_medicine WHERE id_region=1 AND status=1 ORDER BY rate_summ DESC LIMIT 12,12;

Которые должны выводить id не повторяющиеся вроде как.

но на деле во второй выборке встречаются id из первой выборки, что не должно быть. почему так? что за глюк?

id - int AUTO_INCREMENT первичный
id_region - int
status - tinyint
rate_summ decimal(4,1)

индекс id_region + status

PS. Версия сервера: 10.3.31-MariaDB-0ubuntu0.20.04.1 , Версия клиента базы данных: libmysql - mysqlnd 7.4.3
...
Рейтинг: 0 / 0
26.01.2022, 09:16
    #40129461
hibinyru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
вот 2 запроса , красным выделены повторы
...
Рейтинг: 0 / 0
26.01.2022, 09:23
    #40129463
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
Показанный вывод вообще не соответствует запросу. Что ставит под сомнение весь вопрос...

Попробуйте воспроизвести проблему на online fiddle. Скажем, тут: https://dbfiddle.uk/?rdbms=mariadb_10.3
...
Рейтинг: 0 / 0
26.01.2022, 09:34
    #40129465
hibinyru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
Akina, извините, начинающий, по вашей ссылке не понятно что делать.

а что именно не понятно из вопроса?
есть 2 запроса, где ID не не должны повторятся, т.к. они auto_increment, LIMIT Х задан , откуда могут взяться повторы?
...
Рейтинг: 0 / 0
26.01.2022, 09:46
    #40129466
hibinyru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
ставлю эксперименты,
если делаю
ORDER BY name ASC (сортировка по полю varchar) - все работает как надо, выводит без повторов.

может я как то не правильно понимаю rate_summ decimal(4,1) ? задача была записать число с десятичной (одна цифра после запятой)
...
Рейтинг: 0 / 0
26.01.2022, 10:06
    #40129472
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
hibinyru
по вашей ссылке не понятно что делать.

Добавить свои структуру, данные, запрос... и дать ссылку.
Скажем, как тут: https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=f4e20de3ac5eb04b1231546fa3c924d9

PS. Есть подозрение, что поле id ни разу не уникальное... замените в своих запросах SELECT id на SELECT *.
...
Рейтинг: 0 / 0
26.01.2022, 10:06
    #40129473
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
добавьте в выборку поле rate_summ, станет понятнее.
...
Рейтинг: 0 / 0
26.01.2022, 10:11
    #40129484
hibinyru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
Диклевич Александр, Akina,

спасибо. дело оказалось в том что rate_summ одинаковые, добавил в сортировку по id : ORDER BY rate_summ DESC , id ASC LIMIT xx. все заработало.

Я извиняюсь, несколько лет был уверен что конструкция LIMIT XX не выводит повторения если даже ORDER xx повторяются.

Проблема решена, правда через костыль. Спасибо всем за время :)
...
Рейтинг: 0 / 0
26.01.2022, 10:17
    #40129486
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
hibinyru
был уверен что конструкция LIMIT XX не выводит повторения если даже ORDER xx повторяются.

Для удаления повторений существует DISTINCT.

hibinyru
правда через костыль.

Нет тут никакого костыля. Просто исходный запрос - недетерминированный, а исправленный - вероятно, детерминированный (при условии что нет полных дубликатов, по обоим полям).
Вообще, если нужен определённый порядок, то выражение в ORDER BY должно быть таким, чтобы для каждой записи его значение было уникальным.
...
Рейтинг: 0 / 0
29.01.2022, 01:41
    #40130467
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
hibinyru
Диклевич Александр, Akina,

спасибо. дело оказалось в том что rate_summ одинаковые, добавил в сортировку по id : ORDER BY rate_summ DESC , id ASC LIMIT xx. все заработало.

Я извиняюсь, несколько лет был уверен что конструкция LIMIT XX не выводит повторения если даже ORDER xx повторяются.

Проблема решена, правда через костыль. Спасибо всем за время :)

А с чего Вы так решили, что LIMIT исключает повторения?!
LIMIT просто берет записи из выборки, сформированной запросом.
Ваш запрос сортирует выборку по неуникальному полю - в доке написано, что при совпадении значений поля сортировки взаимное расположение записей с дубликатами не определено. Это значит, что при каждой сортировке их порядок следования может менятся.
Т.е., во втором запросе выборка была отсортирована не так, как в первом.
...
Рейтинг: 0 / 0
29.01.2022, 13:05
    #40130497
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
Akina
hibinyru
был уверен что конструкция LIMIT XX не выводит повторения если даже ORDER xx повторяются.

Для удаления повторений существует DISTINCT.

hibinyru
правда через костыль.

Нет тут никакого костыля. Просто исходный запрос - недетерминированный, а исправленный - вероятно, детерминированный (при условии что нет полных дубликатов, по обоим полям).
Вообще, если нужен определённый порядок, то выражение в ORDER BY должно быть таким, чтобы для каждой записи его значение было уникальным.
...
Рейтинг: 0 / 0
29.01.2022, 13:41
    #40130503
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При SELECT LIMIT есть повторения
OlegROA
Ваш запрос сортирует выборку по неуникальному полю - в доке написано, что при совпадении значений поля сортировки взаимное расположение записей с дубликатами не определено.

Говоря иначе, запрос с сортировкой по неуникальному выражению детерминированный с точностью до набора записей, но недетерминированный с точностью до их взаиморасположения.

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


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