powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / При SELECT LIMIT есть повторения
12 сообщений из 12, страница 1 из 1
При SELECT LIMIT есть повторения
    #40129459
hibinyru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. что-то у меня глюк с сортировкой в 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
При SELECT LIMIT есть повторения
    #40129461
hibinyru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот 2 запроса , красным выделены повторы
...
Рейтинг: 0 / 0
При SELECT LIMIT есть повторения
    #40129463
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Показанный вывод вообще не соответствует запросу. Что ставит под сомнение весь вопрос...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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