Запрос к базе данных Sql без сценариев на стороне сервера

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

Привет. Я хочу написать sql-запрос для таблицы:

 user_1(question_id int, option char(1));
  

Здесь, в этой таблице, я question_id упорядочиваю случайным образом, и клиент отправит предыдущий question_id на сервер. Затем мне нужна следующая question_id таблица in, следующая после question_id отправленной клиентом.

Я могу сделать это с помощью сценариев на стороне сервера, но возможно ли это без этого? Я имею в виду прямое выполнение следующего question_id с sql.

Пример данных:

 4, 'A'
2, 'B'
7, 'C'
  

Ответ №1:

У вас нет способа определить, какой вопрос следует задать следующим. Если вы запрашиваете таблицу без какого-либо указанного порядка, может показаться, что у вас есть набор строк, упорядоченных по времени вставки. Хотя это верно для небольших таблиц, вы не должны полагаться на это. Любое количество вставок / удалений записей или выполнение анализа таблицы может изменить этот порядок, и в конечном итоге ваш порядок будет неправильным. Если у вас нет другого столбца, поддерживающего порядок, в который вы вставляли данные, нет абсолютно никакой гарантии, что вы получите это сразу после выполнения select без предложения order by.

Ответ №2:

Если я вас правильно понимаю…

 SELECT MIN(question_id) FROM user_1 WHERE question_id > (value client sent)
  

Комментарии:

1. но question_id упорядочен случайным образом.

2. @codeomnitrix — Если следующий вопрос не является следующим последовательным идентификатором, как вы узнаете, какой это? Возможно, вам следует добавить question_order поле.

Ответ №3:

 select id from question 
where id not in (already asked)
order by rand()
limit 0,1
  

редактировать: при просмотре обновленного вопроса ответ — никоим образом. Вам нужно какое-то другое поле, которое будет задавать порядок вопросов, потому что сейчас невозможно определить, в каком порядке они приходят.

Вы должны думать о таблице базы данных как о НЕУПОРЯДОЧЕННОМ наборе записей.

Комментарии:

1. эй, не могу понять. во-первых, у меня нет записей о ранее заданных вопросах. только последний вопрос, больше ничего. А также не могу понять, что будет делать этот запрос??

2. Он вернет один идентификатор случайного вопроса (упорядоченный по случайным числам). Вы можете оставить эту часть where id not in (...) . Или вы хотите использовать какой-то другой способ рандомизации? Э, обновил мой ответ.

3. я думаю, вы не поняли мою проблему. пожалуйста, посмотрите пример данных. на самом деле question_id уже рандомизирован, поэтому нет необходимости использовать функцию random. я просто хочу следующий неиспользуемый вопрос из случайно расположенных вопросов.

4. О да. Это совершенно не так, как все делается. Во-первых, для рандомизации вопросов вы не обновляете их id -ы в базе данных — вы скорее выбираете вопрос случайным образом id . Во-вторых, вам нужно какое-то средство для идентификации записи (порядка) в таблице — сейчас у вас его нет.