|
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
|
|
Как вычислить место (цифру), где находится запись в базе данных?26.02.2019, 17:10. Показов 6062. Ответов 42
0
|
|
| 26.02.2019, 17:10 | |
|
Ответы с готовыми решениями:
42
Записи в базе данных, как встать на последнюю запись в базе после открытия? Чтение файла, чтение названия папки где находится файл, запись данных на PHP Access: вставить random'ное число в место таблицы где находится курсор ввода |
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 10.03.2019, 17:43 | |
|
sergeyilyin1984,
.. если вы все-таки решили вытаскивать индекс строки (из каких-то соображений), конвертируйте список в массив (.ToArray), и сортируйте его и потом обращайтесь уже к индексу, который есть у каждого уважающего себя массива ....
0
|
|
|
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
|
|
| 10.03.2019, 18:36 [ТС] | |
|
yurickas, Как?
0
|
|
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
|
| 11.03.2019, 07:32 | |
|
sergeyilyin1984, выглядит так, как будто вы сами слабо понимаете, что просите. Если вам нужно "топ 5" записей, то их можно выдернуть в SQL через
SELECT TOP 5 ..., а в EF (Core) через метод Take(5). Это даст вам первые пять записей. Если вам нужна сортировка по какому-то критерию, то добавляйте её в запросе. Тогда записи вам вернутся в гарантированном порядке (каком запросите). В самой СУБД никаких индексов у записей нет и выдумавать их не надо. ROW_NUMBER() и аналоги вам тоже на фиг не нужны, ибо записи придут в том порядке, в каком укажите. И позиция в выборке, где оказалась запись, и будет "местом (цифрой), где находится запись".
0
|
|
|
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
|
|
| 11.03.2019, 10:26 [ТС] | |
|
Usaga, Да понял я всё это!Мне нужно выдернуть не массив с индексами, а конкретную запись (точнее её номер).Например, это текущий пользователь и он находится на 52 строке.Его номер 52.Как выдернуть одну запись этого пользователя и сказать ему: "Заключённый 52!"?Пока остановился на хранимке с ROW_NUMBER(), которая возвращает номер строки в клиентский код.Но так как Вы не советуете использовать хранимки, то тогда варианты?
0
|
|
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
||
| 11.03.2019, 10:51 | ||
|
sergeyilyin1984, ещё раз: у данных в СУБД нет номеров строк. Порядок в котором записи хранятся не определён.
ROW_NUMBER() просто назначает порядковые номера записям в выборке (то, что вы вытаскиваете запросом SELECT, а не то как оно всё это хранится). Этот порядок определяется условиями сортировки и отбора данных в запросе.
0
|
||
|
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
|
|||
| 11.03.2019, 11:11 [ТС] | |||
|
Usaga,
Ладно, опишу требования.Есть игроки: Петя, Вася, Оля.Они занимают определённые места в игре.Сейчас поле рейтинга игроков имеет тип DateTime.Если один из игроков хочет занять первое место платно, то оплатив его, меняет дату на NOW.При ORDER BY он имеет приоритет по дате.Нужно сделать, так, чтобы текущий игрок всегда видел в приложении своё место (1 или 5 ...).Был совет -
0
|
|||
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
|
| 11.03.2019, 11:32 | |
|
sergeyilyin1984, ага, понял. Ну да. Просто решение в лоб - сортировка по рангу и подсчёт. Правда, при большом количестве игроков и низком рейтинге текущего игрока, это может работать не очень быстро (базе придётся перебирать все записи).
Правда для этого совершенно не обязательна процедура. Она тут ничего не ускорит. Я бы не стал тут использовать дату. Если рейтинг игроков не зависит от очков и строго задаётся приложением, то лучше завести глобальный счётчик (Sequence) и брать оттуда последовательные значения для рейтинга пользователей. Хотя такие решения позволяют игроку только на самый верх списка перемещаться. Если нужна возможность подниматься на одну ступень, а не только сразу вверх, то рейтинг должен выражаться простым счётчиком, не уникальным для всей таблицы (как сейчас, с датой).
0
|
|
|
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
|
|||
| 11.03.2019, 12:20 [ТС] | |||
|
0
|
|||
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
||||||||
| 11.03.2019, 12:36 | ||||||||
|
Примерно такое:
0
|
||||||||
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
|||||||||||
| 11.03.2019, 12:38 | |||||||||||
|
Тут позиция определяется по факту оплаты.
Можно конечно каждый раз перерасчитывать позиции , делать несколько запросов к БД , в том числе обновлять счетчик позиций для всех записей - но это медленное решение. Что бы не трогать БД лишний раз, просто делаем один раз запрос к БД и выбираем всех пользователей у которых дата оплаты позже даты оплаты текущего юзера. , можно сразу count к записям применить , дабы вычислить позицию текущего юзера.
1
|
|||||||||||
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
||
| 11.03.2019, 12:41 | ||
|
0
|
||
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
||
| 11.03.2019, 12:49 | ||
|
Ну и еще для пущей оптимизации , у нас же в любом случае есть данные по текущему юзеру , можно посмотреть какая там дата , если разница между текущим днем и датой оплаты слишком большая . то даже запрос к БД не делаем , ибо юзера не интересует точность позиции 10001 или 20001 , просто выводим информацию шо он в жопе рейтинга.
1
|
||
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
|
| 11.03.2019, 12:55 | |
|
sau, на самом деле, если бы использовался Sequence, то достаточно было бы посчтитать разницу между значением рейтинга текущего пользователя и максимальным значением рейтинга среди всех пользователей (мгновенно при наличии индекса по этому полю). Такое решение потребуте только один запрос и скорость будет молнееносной вне зависимости от количества игроков (хоть миллионы).
0
|
|
|
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
|
|
| 11.03.2019, 12:58 | |
|
Или рейтинг представляем отдельной таблицей. Например нам интересно сделать список топ-10. Таблица имеет 10 фиксированный записей.
При выводе всех игроков, сначала выводим данные нашей таблицы топ-10 (на 10 записей не надо много тратить ресурсов), потом все остальные в любом удобном порядке. Запись таблицы в топ-10 содержит: ид игрока, дату покупки места, дату после которой игрок вылетает из списка. При формировании списка нам надо только найти 10 игроков в базе и сделать список. При оплате места, мы имеем информацию, доступно это место или нет для оплаты. Если доступно, то какие действия предпринимаем с текущей позицией (понижаем на позицию вниз или выкидываем в общий список) и т.д. Ну, как-то так.
0
|
|
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
||
| 11.03.2019, 12:59 | ||
|
Ну и в целом , если уж про оптимизацию говорить и мильоны записей , то конечно есть архивные таблицы и "горячие" , это отдельным таском на сервере разруливается . раз в сутки часть данных переносятся в архивную таблицу по дате их создания. Таким образом , hot таблица не будет содержать мильоны.
0
|
||
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
|
| 11.03.2019, 12:59 | |
|
sau, нет. Только тому, кого повышаем.
0
|
|
|
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
|
|
| 11.03.2019, 13:00 [ТС] | |
|
sau, Позиция игроков должна определяться всегда.Например, только что зарегистрированный игрок сразу попадает в топ.Дата регистрации копируется в рейтинг по датам.Свою позицию игрок должен видеть всегда и везде в приложении.
0
|
|
|
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
|
|
| 11.03.2019, 13:07 | |
|
sau, хотя нет, вы правы. Одни и теже игроки несколько раз повышаться могут. Тогда разница в счётчике не будет соответствовать разнице в количестве игроков.
Добавлено через 5 минут sergeyilyin1984, заведите в базе несколько тысяч записей с рандомными рейтингами и примерьте варианты, что тут озвучены были мной и господином sau. Посмотрите на сколько быстро (или медленно) отрабатывают наихудшие ситуации с определением рейтинга самого "низкого" пользователя. Вполне возможно, что будет достаточно быстро на первое время. А дальнейшие оптимизации уже можно будет вырабатывать по мере надобности, а не заранее.
0
|
|
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
||
| 11.03.2019, 13:44 | ||
|
Но , у Вас то либо топ-1 , либо его текущая позиция , а какая она по факту - без разницы т.к этот численный показатель ровным счетом ни на что не влияет., можно просто случайное число выдать если юзер по дате в ТОП-10 не попал , он же не полезет в БД кол-во реальных записей проверять. Условия задачи должны быть осмысленны , а не просто потому шо как у всех ). В целом , я не против всяких там счетчиков , отдельных таблиц рейтинга и т.п. , но , если Вы следуете паттернам разработки , тот же DTO с репозиторием , то каждая новая таблица - новая сущность модели данных , новый репозиторий , новые методы у сервиса данных и т.п. , т.е нехило так код разрастается на пустом месте , когда и если есть возможность обойтись коротким решением без введения новых сущностей - то лучше так и поступить. , а для этого нужно подумать о целесообразности тех или иных условий задачи.
0
|
||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
||||||
| 11.03.2019, 14:42 | ||||||
|
.. вот ради интереса попробовал .. поскольку ТС тяготеет с SQL-коду и хранимкам ... вот такая хранимка обновляет и дату (поле paydate), и рейтинг(поле rating) без каких-либо трудностей, но на паре десятков записей .. будет ли это тормозить в Лас-Вегасе - вопрос ...
.. userid от фонаря, но подразумевается, что он как-то передается параметром ...
0
|
||||||
| 11.03.2019, 14:42 | |
|
Как узнать что в базе данных появилась запись? Как по дате в календаре найти нужную запись в Базе данных Как добавить, удалить или изменить запись в ListBox, чтобы при этом изменения сохранились в базе данных? Сортировка массива и запись данных в файл в произвольное место
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|