Как перетасовать таблицу записей в Delphi?

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


person George Burslem    schedule 27.02.2015    source источник
comment
Вы не можете перетасовать записи в таблице, если под таблицей вы подразумеваете таблицу базы данных, а под записями вы подразумеваете строки. Базы данных не понимают перетасовки. Многие диалекты SQL предлагают функцию RANDOM(), которую вы можете использовать для генерации псевдозначений для искусственного столбца, и вы можете ORDER BY этого столбца или вы можете получить значения ID из каждой строки в массив в Delphi, перетасовать этот массив, получить значение из случайного элемента массива и использовать его для запроса и извлечения соответствующей строки из БД. Если вы можете предоставить определение таблицы и подтвердить то, что вы просите, мы, вероятно, сможем помочь.   -  person Ken White    schedule 27.02.2015
comment
Получение случайных результатов из таблицы MySQL: stackoverflow.com/q/16928079/33732   -  person Rob Kennedy    schedule 27.02.2015
comment
Не храните свои вопросы в базе данных. И я действительно имею в виду, не надо. При этом все, что вы создадите, — это много работы для вашей базы данных. Вместо этого отфильтруйте все свои вопросы по определенной категории. Затем сгенерируйте случайное число от 0 до количества отфильтрованных записей базы данных. А затем извлеките N-й вопрос из этого отфильтрованного списка ваших вопросов. Теперь я не знаю, как добиться этого с помощью базы данных, потому что мои знания о работе с ними слишком малы, но я все еще понимаю логику того, как это сделать.   -  person SilverWarior    schedule 28.02.2015


Ответы (1)


Как правило, это зависит от вашей базы данных. Например, в Oracle вы можете перетасовать записи, используя

select <fields>
from questions
where <some-conditions>
order by dbms_random.value

Но я сомневаюсь, что это хороший подход в целом. Вы должны либо запросить «дайте мне один случайный вопрос каждой категории», если хотите, либо, что ближе к реальным задачам, просто получить все вопросы и выполнить некоторую фильтрацию на клиенте.

person Sanders the Softwarer    schedule 27.02.2015
comment
Судя по тегам моего вопроса, база данных известна как MySQL. - person Rob Kennedy; 27.02.2015
comment
Почему вы сомневаетесь, что это хороший подход? Вы не можете просто написать это без объяснения причин. - person Rob Kennedy; 27.02.2015
comment
Я упомянул RANDOM в своем комментарии выше, и если ваш единственный контент - это та же информация для совершенно неправильной базы данных (вопрос явно помечен как MySQL), я не вижу, как это добавляет здесь какую-либо ценность. - person Ken White; 27.02.2015