Случайный игрок с которым можно поиграть

Статус
Закрыто для дальнейших ответов.

Volter9

defined('SURRENDER') or die(); // StarWars
Регистрация
27.05.2012
Сообщения
1 145
Здравствуйте! Мне нужна помощь со составлением запроса в базу данных. Помогите пожалуйста, или хотя бы дайте мне направление. Спасибо!

Есть две таблицы:

games:
(эта таблица отвечает за игры между двумя игроками)



и users:
(в этой таблице содержится вся информация о пользователе)


Есть кука которая содержит в себе информацию о пользователе, логин и т.д.
Нужно взять случайный логин (users.login) который не будет равен куке. Но не просто так:

SELECT `login` FROM `users` WHERE `login`!='.$user.' ORDER BY RAND() LIMIT 1

А нужно взять логин который будет случайным и с которым пользователь ($user) еще не играл.

У меня пока что так получилось:

SELECT DISTINCT `users`.`login` FROM `games`,`users` WHERE `users`.`login` != '.$user.' AND `games`.`organizer_name` != '.$user.' AND `games`.`player_name` != '.$user.' AND `games`.`organizer_name` != `users`.`login` AND `games`.`player_name` != `users`.`login` ORDER BY RAND() LIMIT 1

Всем спасибо за помощь.

P.S.: Надеюсь что я написал все понятно, если есть вопросы задавайте.
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Общая схема такова

SELECT <поля>
FROM <юзеры>
WHERE
NOT EXISTS (
SELECT 1
FROM <история_игр>
WHERE
(<игрок1> = <id_игрока_для_которого_ищем_соперника> AND <игрок2> = <юзеры>.<id>) OR
(<игрок2> = <id_игрока_для_которого_ищем_соперника> AND <игрок1> = <юзеры>.<id>)
)
ORDER BY RAND()
LIMIT 1

Правда на сотнях тысяч записей такой запрос будет затратным, нужно будет ограничивать поиск теми, кто онлайн.
Ещё для очень больших наборов есть костыли вместо ORDER BY RAND() вроде

Код:
(FLOOR(RAND()*1000) % 4) = 3
 

Volter9

defined('SURRENDER') or die(); // StarWars
Регистрация
27.05.2012
Сообщения
1 145
Спасибо, [member=CamaroSS], это решение не помогло. :(
НО, я нашел другое решение:

SELECT `id`,`login` FROM `users`
WHERE `id` NOT IN
(
SELECT IF(`organizer`=<user_id>,`player`,`organizer`) AS `login`
FROM `games`
WHERE `organizer` = <user_id>
OR `player` = <user_id>
UNION
SELECT <user_id> AS `login`
)
ORDER BY RAND()
LIMIT 1

По любому спасибо!
 
Статус
Закрыто для дальнейших ответов.
Верх Низ