Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/27: Рейтинг темы: голосов - 27, средняя оценка - 4.81
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482

Как вычислить место (цифру), где находится запись в базе данных?

26.02.2019, 17:10. Показов 6062. Ответов 42

Студворк — интернет-сервис помощи студентам
Id не учитываются.Они вида - dsgkl154657dfgdfgdfg.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2019, 17:10
Ответы с готовыми решениями:

Записи в базе данных, как встать на последнюю запись в базе после открытия?
Есть два вопроса. Во-первых - как встать на последнюю запись в базе после открытия? И во-вторых - есть база в которую каждые 10...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -> Vehicles -> Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

Access: вставить random'ное число в место таблицы где находится курсор ввода
Помогите пожалуйста с таким макросом который будет просто вставлять рандомное число в поле таблицы где находится курсор ввода. В идеале...

42
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
Эксперт .NET
 Аватар для Usaga
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
Эксперт .NET
 Аватар для Usaga
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
11.03.2019, 10:51
sergeyilyin1984, ещё раз: у данных в СУБД нет номеров строк. Порядок в котором записи хранятся не определён. ROW_NUMBER() просто назначает порядковые номера записям в выборке (то, что вы вытаскиваете запросом SELECT, а не то как оно всё это хранится). Этот порядок определяется условиями сортировки и отбора данных в запросе.

Цитата Сообщение от sergeyilyin1984 Посмотреть сообщение
то тогда варианты?
Чётко озвучить требования. Без указания вашего видения решения.
0
14 / 14 / 0
Регистрация: 27.07.2018
Сообщений: 482
11.03.2019, 11:11  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
sergeyilyin1984, ещё раз: у данных в СУБД нет номеров строк. Порядок в котором записи хранятся не определён. ROW_NUMBER() просто назначает порядковые номера записям в выборке (то, что вы вытаскиваете запросом SELECT, а не то как оно всё это хранится). Этот порядок определяется условиями сортировки и отбора данных в запросе.
Так я это и делаю в хранимой функции, которая сортирует и расставляет номера с помощью ROW_NUMBER() OVER(ORDER BY ...), а номер строки, при условии WHERE Users.Id = $1, возвращается в код C#.
Ладно, опишу требования.Есть игроки: Петя, Вася, Оля.Они занимают определённые места в игре.Сейчас поле рейтинга игроков имеет тип DateTime.Если один из игроков хочет занять первое место платно, то оплатив его, меняет дату на NOW.При ORDER BY он имеет приоритет по дате.Нужно сделать, так, чтобы текущий игрок всегда видел в приложении своё место (1 или 5 ...).Был совет -
Цитата Сообщение от sau Посмотреть сообщение
от текущей даты вычитается изначальная дата , путем несложных подсчетов , можно узнать сколько прошло часов и кто на какой позиции должен быть
.Но мне кажется, что проще в хранимке посчитать строки и вернуть одну по Id.
0
Эксперт .NET
 Аватар для Usaga
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  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Правда для этого совершенно не обязательна процедура. Она тут ничего не ускорит.
Usaga, Как тогда в EF Core использовать ROW_NUMBER()?Или тогда как вычислить номер строки?
Цитата Сообщение от Usaga Посмотреть сообщение
Я бы не стал тут использовать дату. Если рейтинг игроков не зависит от очков и строго задаётся приложением, то лучше завести глобальный счётчик (Sequence) и брать оттуда последовательные значения для рейтинга пользователей.
То есть, нужно создать отдельную таблицу с рейтингом например от 1 до 10 и при оплате игроком, брать из неё значение 1, затем вставлять его в поле рейтинг таблицы игроки?
0
Эксперт .NET
 Аватар для Usaga
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
11.03.2019, 12:36
Цитата Сообщение от sergeyilyin1984 Посмотреть сообщение
Как тогда в EF Core использовать ROW_NUMBER()?Или тогда как вычислить номер строки?
EF такое не позволит сделать не вытащив на клиент кучу данных. Выполните голый SQL-запрос. Придётся отсортировать игроков по рейтингу (дата это или значение счётчика - тут не важно) на убывание и завернуть это дела в другой запрос, вытаскивающий номер игрока по ID. Одним запросом такое не сделать. Или какую-то оконную функцию подтянуть, но я не уверен. Т.е. должен быть запрос над запросом.

Примерно такое:
SQL
1
2
3
4
5
SELECT Rn FROM (
    SELECT TOP (5)
          *, ROW_NUMBER() OVER (ORDER BY [Поле С Рангом] DESC) AS Rn
      FROM [Player]) AS X
WHERE Id = 5547
Цитата Сообщение от sergeyilyin1984 Посмотреть сообщение
То есть, нужно создать отдельную таблицу с рейтингом например от 1 до 10 и при оплате игроком, брать из неё значение 1, затем вставлять его в поле рейтинг таблицы игроки?
Последовательность (Sequence) объект отдельного вида. Не таблица. Это глобальный счётчик.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
11.03.2019, 12:38
Тут позиция определяется по факту оплаты.
Можно конечно каждый раз перерасчитывать позиции , делать несколько запросов к БД , в том числе обновлять счетчик позиций для всех записей - но это медленное решение.

Что бы не трогать БД лишний раз, просто делаем один раз запрос к БД и выбираем всех пользователей у которых дата оплаты позже даты оплаты текущего юзера. , можно сразу count к записям применить , дабы вычислить позицию текущего юзера.

T-SQL
1
select count(*) from Table where PayDate>=@CurrentUserPayDate order by desc PayDate
Можно просто вытянуть ТОП-10 оплативших , и там уже юзер сам видит входит он в топ или нет.
T-SQL
1
select top(10) *  from Table order by desc PayDate
1
Эксперт .NET
 Аватар для Usaga
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
11.03.2019, 12:41
Цитата Сообщение от sau Посмотреть сообщение
у которых дата оплаты позже даты оплаты текущего юзера.
Интересное решение, но страдает той же самой балячкой, что и мой вариант: если игрок имеет самый низкий рейтинг (раньше всех заплатил), то базе придётся вытащить\посчитать всех.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
11.03.2019, 12:49
Цитата Сообщение от Usaga Посмотреть сообщение
то базе придётся вытащить\посчитать всех.
Все не нужно , но запроса будет два . первым запросом выводим топ-10 записей сортированных по дате оплаты , если юзера в этом топе нет - это уже смотрим на клиенте по массиву из 10-ти записей , то делаем еще один уточняющий запрос к БД на определение его позиции , т.е select count(*) , результат будет не мильон записей , а одна - номер позиции текущего юзера не попавшего в ТОП-10.
Ну и еще для пущей оптимизации , у нас же в любом случае есть данные по текущему юзеру , можно посмотреть какая там дата , если разница между текущим днем и датой оплаты слишком большая . то даже запрос к БД не делаем , ибо юзера не интересует точность позиции 10001 или 20001 , просто выводим информацию шо он в жопе рейтинга.
1
Эксперт .NET
 Аватар для Usaga
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
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
11.03.2019, 12:59
Цитата Сообщение от Usaga Посмотреть сообщение
au, на самом деле, если бы использовался Sequence, то достаточно было бы посчтитать разницу между значением рейтинга текущего пользователя и максимальным значением рейтинга среди всех пользователей
только еще придется эти рейтинги каждый раз проставлять , обновляя весь массив подходящих записей.

Ну и в целом , если уж про оптимизацию говорить и мильоны записей , то конечно есть архивные таблицы и "горячие" , это отдельным таском на сервере разруливается . раз в сутки часть данных переносятся в архивную таблицу по дате их создания.
Таким образом , hot таблица не будет содержать мильоны.
0
Эксперт .NET
 Аватар для Usaga
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
Эксперт .NET
 Аватар для Usaga
14726 / 9496 / 1362
Регистрация: 21.01.2016
Сообщений: 35,813
11.03.2019, 13:07
sau, хотя нет, вы правы. Одни и теже игроки несколько раз повышаться могут. Тогда разница в счётчике не будет соответствовать разнице в количестве игроков.

Добавлено через 5 минут
sergeyilyin1984, заведите в базе несколько тысяч записей с рандомными рейтингами и примерьте варианты, что тут озвучены были мной и господином sau. Посмотрите на сколько быстро (или медленно) отрабатывают наихудшие ситуации с определением рейтинга самого "низкого" пользователя. Вполне возможно, что будет достаточно быстро на первое время.

А дальнейшие оптимизации уже можно будет вырабатывать по мере надобности, а не заранее.
0
 Аватар для sau
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
11.03.2019, 13:44
Цитата Сообщение от sergeyilyin1984 Посмотреть сообщение
Позиция игроков должна определяться всегда.
это если бы ваша система позволяля перемещать юзера по позиции , например не сразу в топ-1 , а на 10-ть позиций или 20-ть , тогда да , юзеру нужно знать сколько он должен заплатить что бы попасть хотя бы в топ-10 от своей текущий позиции.

Но , у Вас то либо топ-1 , либо его текущая позиция , а какая она по факту - без разницы т.к этот численный показатель ровным счетом ни на что не влияет., можно просто случайное число выдать если юзер по дате в ТОП-10 не попал , он же не полезет в БД кол-во реальных записей проверять. Условия задачи должны быть осмысленны , а не просто потому шо как у всех ).

В целом , я не против всяких там счетчиков , отдельных таблиц рейтинга и т.п. , но , если Вы следуете паттернам разработки ,
тот же DTO с репозиторием , то каждая новая таблица - новая сущность модели данных , новый репозиторий , новые методы у сервиса данных и т.п. , т.е нехило так код разрастается на пустом месте , когда и если есть возможность обойтись коротким решением без введения новых сущностей - то лучше так и поступить. , а для этого нужно подумать о целесообразности тех или иных условий задачи.
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
11.03.2019, 14:42
.. вот ради интереса попробовал .. поскольку ТС тяготеет с SQL-коду и хранимкам ... вот такая хранимка обновляет и дату (поле paydate), и рейтинг(поле rating) без каких-либо трудностей, но на паре десятков записей .. будет ли это тормозить в Лас-Вегасе - вопрос ... .. userid от фонаря, но подразумевается, что он как-то передается параметром ...

SQL
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @rating INT
SELECT @rating = (SELECT rating
FROM UsersCyber WHERE userid= 14)
UPDATE UsersCyber SET rating = rating+1
WHERE rating < @rating
UPDATE UsersCyber SET paydate = getdate()
WHERE userid= 14
UPDATE UsersCyber SET rating = 1
WHERE userid= 14
SELECT * FROM UsersCyber
WHERE paydate IS NOT NULL
ORDER BY rating
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.03.2019, 14:42

Как узнать что в базе данных появилась запись?
Добрый день, я создаю приложение по обмену текстовыми сообщениями. В базе данных у меня есть таблица для хранения сообщений. И я хочу что...

Как по дате в календаре найти нужную запись в Базе данных
Помогите, пожалуйста! Есть форма в которой установлен объект Календарь. Необходимо по клику по дню календаря найти соответствующую запись в...

Как добавить, удалить или изменить запись в ListBox, чтобы при этом изменения сохранились в базе данных?
Как добавить, удалить или изменить запись в Listbox, чтобы при этом изменения сохранились в базе данных??? Кто нибудь может помочь с кодом...

Сортировка массива и запись данных в файл в произвольное место
Есть ли функция для сортировки массива на C++? Если, например, нету возможности использовать сортировки Пузырька, Вставками и т.п. Как...

Вычислить сумму строки, где находится элемент с максимальным значением
Массив 5 на5 вычислить сумму строки , где находится элемент с максимальным значением


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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 реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru