2014-11-05 2 views
0

У меня есть четыре таблицы:Как создать такой запрос?

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

Я хочу, чтобы получить название игры турнира, название платформы, игровые автоматы, цена, reservedSlots (кол-участий), информация ли какой-то игрок (его идентификатор предоставляется PHP) участие в этом турнире (BOOL/истине) и условие: - GameID должен быть в указанном массиве, предоставляемый РНР - platformId должен быть в указанном массиве, предоставляемого РНР

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

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

Что не работает? журнал ошибок? работает ли запрос в mysql workbench, т. е. является ли запрос действительным – ChelseaStats

+1

И что именно неправильно? У вас нет выхода или неправильного вывода? – Gudgip

+0

Есть выход, но это не то, что я хочу. Он возвращает столько записей, сколько существует при участии с данными аргументами – Lukas

ответ

1

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

$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-инъекциями.

+0

Я думаю, что это то, что я искал;) Я добавил только одно условие, чтобы получить только открытые турниры, но спасибо, что ответили , задача решена. – Lukas

+0

@ Лукас, я рад, что смогу помочь. Если мой ответ решает проблему, тогда вы можете принять ее как правильный ответ. –

Смежные вопросы