Я бы предложил создать три стола.
CREATE TABLE IF NOT EXISTS `data` (
`id` int(11) NOT NULL,
`value` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL,
`name` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
INSERT INTO `users` (`id`, `name`) VALUES
(1, 'John'),
(2, 'Jane'),
(3, 'Bill'),
(4, 'Ben');
CREATE TABLE IF NOT EXISTS `users_data` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`data_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `data`
ADD PRIMARY KEY (`id`);
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);
ALTER TABLE `users_data`
ADD PRIMARY KEY (`id`);
ALTER TABLE `data`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `users`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
ALTER TABLE `users_data`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Теперь вы можете вставить свои 1000 записей в таблицу данных. Каждый раз, когда вы получаете 50 случайных результатов из таблицы data
, вставьте эти значения в таблицу users_data
.
Для выбора значения из данных, выполните следующий запрос:
SELECT *
FROM data
WHERE data.id NOT iN (
SELECT data_id
FROM users_data
WHERE user_id != '...current user id...'
)
ORDER BY RAND()
LIMIT 50
Вставьте извлекаемые значения с текущим идентификатором пользователя в users_data
. Таким образом, пользователи никогда не смогут получить значения, полученные другими пользователями.
Я не эксперт по БД, но как вы можете достичь этого с помощью временных таблиц, поскольку они связаны сеансом? когда вы берете первые 50 в темп, второй логин будет принимать одинаковые 50, поскольку он не видит таблицу temp ... Или я ошибаюсь? – mloureiro
Кстати, я не имел в виду SQL-таблицу temp. В таблице будет удерживаться строка только для временной. При входе в систему я выберу 50 строк, которые не существуют во временной таблице, и поместите их в эту таблицу. И очистите его после выхода из системы. Это плохой подход>. <. –