#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
. Во-вторых, вам нужно какое-то средство для идентификации записи (порядка) в таблице — сейчас у вас его нет.