Перейти к содержимому

Фотография
- - - - -

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


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 2

#1 Volter9

Volter9

    defined('SURRENDER') or die(); // StarWars

    Топикстартер
  • V.I.P.
  • 158
    1 145 сообщ.

Отправлено 27 Декабрь 2013 в 06:24

Здравствуйте! Мне нужна помощь со составлением запроса в базу данных. Помогите пожалуйста, или хотя бы дайте мне направление. Спасибо!

 

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

 

games:

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

 

QJO7Nyi.png

 

и users:

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

cc3nRdp.png

 

Есть кука которая содержит в себе информацию о пользователе, логин и т.д.

Нужно взять случайный логин (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.: Надеюсь что я написал все понятно, если есть вопросы задавайте.


  • 0

Спонсор

#2 CamaroSS

CamaroSS

    Частый гость

  • Участник
  • 52
    176 сообщ.

Отправлено 27 Декабрь 2013 в 09:42

Общая схема такова

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

  • 1

#3 Volter9

Volter9

    defined('SURRENDER') or die(); // StarWars

    Топикстартер
  • V.I.P.
  • 158
    1 145 сообщ.

Отправлено 29 Декабрь 2013 в 04:26

Спасибо, 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

По любому спасибо!


Сообщение отредактировал Volter9: 29 Декабрь 2013 в 04:28

  • 0



Похожие темы Свернуть

Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей