Хранить случайно выбранные строки в сеансе? - PullRequest
1 голос
/ 25 июля 2011

Хранение случайно выбранных строк в сеансе?

Привет! * * 1003

Я создаю скрипт PHP, который выводит случайное слово из таблицы MySQL. Каждый раз, когда скрипт обновляется, я хочу отображать новое слово. (Это связано с jquery - поэтому вывод данных из php-файла напрямую отображается на моей странице)

Однако я хочу отобразить каждое слово только один раз. Если все слова выбраны, я хочу, чтобы скрипт перезагружался и начинал снова.

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

Итак, запрос выглядит так:

session_start();
$id = session_id();

$random_sql = "SELECT *
FROM wordlist AS a
LEFT JOIN visited AS b ON a.word = b.word
AND b.sessionid = '$id'
WHERE b.word IS NULL
ORDER BY a.weight * rand( ) DESC  // Weighted random
LIMIT 1";


$random_row = mysql_query($random_sql);

if(mysql_num_rows($random_row) > 0)
{
while($row = mysql_fetch_row($random_row))
{
$insert_query = "INSERT INTO visited (ID, word, sessionid, date) VALUES ('$row[0]', '$row[1]', '$id', CURDATE())";
$insert = mysql_query($insert_query) or die (mysql_error());
echo $row[1];
}

Это прекрасно работает, но я считаю, что для базы данных будет сложно обрабатывать много посетителей одновременно?

Итак, мой вопрос:

Как сохранить информацию о «посещенных» словах в сеансе и исключить их из запроса?

Еще одна вещь: я предполагаю, что таблица словаря будет иметь около 8000 строк. Будет ли это слишком много для функции ORDER BY RAND, и рендеринг будет заметно медленным?

Спасибо!

1 Ответ

0 голосов
/ 25 июля 2011

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

Относительно производительности : если слова индексируются последовательно, вы можете подумать о генерациислучайное число в качестве прямого идентификатора и просто получить конкретную строку напрямую.ORDER BY RAND() должен сгенерировать все числа и отсортировать их, что гораздо менее эффективно, чем просто сгенерировать один идентификатор типа RAND() * MAX(ID).

Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...