Как создать такой запрос?

У меня есть четыре таблицы:

  • турниры (идентификатор, имя, слоты, цена, идентификатор игры, идентификатор платформы)
  • игры (идентификатор, имя)
  • платформы (идентификатор, имя)
  • участия (id, tourId, playerId)

Я хочу получить название игры турнира, название платформы, слоты, цену, reservedSlots (количество участников), информацию о том, участвует ли какой-либо игрок (его идентификатор предоставлен php) в этом турнире (bool / true), и условия:
— gameId должен быть в указанном массиве, предоставленном php
— platformId должен быть в указанном массиве, предоставленном php

Я создал что-то вроде этого, но это не работает правильно:

PHP:

$platformsList = "'". implode("', '", $platforms) ."'"; //
$gamesList = "'". implode("', '", $games). "'";

MySQL:

    SELECT
t. NAME AS tournamentName,
t.id,
t.slots,
p. NAME,
g. NAME AS gameName,
t.price
FROM
tournaments AS t,
platforms AS p,
games AS g,
participations AS part
WHERE
t.PlatformId = p.Id
AND t.GameId = g.Id
AND t.Slots - (
SELECT
count(*)
FROM
participations
WHERE
TournamentId = t.id
) > 0
AND part.TournamentId = t.Id
AND t.PlatformId IN ($platformsList)
AND t.GameId IN ($gamesList)

0

Решение

Я не буду вдаваться в твою почту и получать значения, я буду считать, что все в порядке:

$possibleGameIDs = getPossibleGameIDs(); //function will return the array you need for possible game id values. Inside your function make sure that the id values are really numeric
$possiblePlatformIDs = getPossiblePlatformIDs(); //function will return the array you need for possible platform id values. Inside your function make sure that the id values are really numeric
$playerId = getPlayerId(); //function returns the player id and makes sure that it is really a number

$sql = "select games.name, platforms.name, tournaments.slots, tournaments.price, ".
"(select count(*) from participations where participations.tournamentId = tournaments.tournamentId) as reservedSlots, ".
"(select count(*) > 0 from participations where participations.tournamentId = tournaments.tournamentId and playerId = ".$playerId.") as isParticipating ".
"from tournamens ".
"join games ".
"on tournaments.gameId = games.id ".
"join platforms ".
"on tournaments.platformId = platforms.id ".
"where games.id in (".implode(",", $possibleGameIDs).") and ".
"      platforms.id in (".implode(",", $possiblePlatformIDs).") and ".
"      tournaments.slots > 0"

Код не был протестирован, поэтому, пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы с его использованием. Естественно, вам нужно запустить его, но, поскольку вы не указали, что вы используете для выполнения запроса, я не выделил время на технические детали его выполнения. Остерегайтесь SQL-инъекций, хотя.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector