Персональный подбор пользователей в SQL

210
30 мая 2018, 02:10

Пишу небольшую игру, возникла проблема с подбором игроков.

Задача: как только юзер вошёл на арену, искать ему противников в базе по заданным критериям и сортировать это всё в случайном порядке. В переменной $user - данные игрока.;

  • У противника стоит готовность к боям: warriors.fight_ready = 1;
  • Уровень противника (warriors.level) равен уровню игрока, или +- 1 уровень;
  • Энергия противника (warriors.energy) больше 0;
  • Противник за последний (fights.time) час не дрался с вошедшим игроком;

Мои таблицы:

warriors (игроки)

CREATE TABLE IF NOT EXISTS `warriors` (
  `id` INT(11) AUTO_INCREMENT COMMENT 'ID записи',
  `user_id` bigint NOT NULL COMMENT 'ID юзера',
  `level` INT(11) UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Уровень',
  `energy` INT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Энергия',
  `fight_ready` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '1 - готов к боям, 0 - нет',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата создания',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата обновления',
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

fights (все проведённые бои)

CREATE TABLE IF NOT EXISTS `fights` (
  `id` INT(11) AUTO_INCREMENT COMMENT 'ID записи',
  `attacker_id` INT(11) NOT NULL COMMENT 'ID нападавшего',
  `defender_id` INT(11) NOT NULL COMMENT 'ID защищающего',
  `winner_id` INT(11) NOT NULL COMMENT 'ID победителя',
  `time` INT(11) NOT NULL COMMENT 'Дата в UNIX-формате',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата создания',
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата обновления',
  PRIMARY KEY (`id`),
  FOREIGN KEY (`attacker_id`) REFERENCES `warriors` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (`defender_id`) REFERENCES `warriors` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (`winner_id`) REFERENCES `warriors` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

То есть, как только юзер заходит на арену, нужно через SELECT получить рандомного противника по указанным выше критериям. Как можно это всё правильно реализовать одним запросом? ЯП - PHP.

Я набросал такой вот запрос, не знаю, правильно ли с точки зрения синтаксиса, и как туда подключить ещё тех, кто не дрался с юзером за последний час.

$enemiesStmt = $pdo->prepare("SELECT * FROM `warriors` WHERE `fight_ready` = :status AND `energy` > :energy AND (`level` = :level AND `level` = (`level` + 1) AND `level` = (`level` - 1)) ORDER BY RAND() LIMIT 1");
$enemiesStmt->execute([
    'status' => 1,
    'energy' => 1,
    'level' => $user['level'],
]);
READ ALSO
wp_add_inline_style wordpress шрифты

wp_add_inline_style wordpress шрифты

У меня возникла проблема с изменением стилей при использовании wp_add_inline_style Приведу пример, я хочу чтобы я мог выбирать шрифты для параграфа...

199
Могу ли я и как подключить webrtc/apprtc в php проект?

Могу ли я и как подключить webrtc/apprtc в php проект?

Могу ли я подключить и как ресурс webrtc/apprtc в PHP проектApprtc это гугла ресурс для webrtc

187
Ошибка в работе SOAP

Ошибка в работе SOAP

Решил разобраться с основами работы SOAPНаписал код указанный ниже

200