Mysql получить строку в зависимости от различных выборов - PullRequest
0 голосов
/ 30 января 2020

У меня есть 4 таблицы: одна называется играми, которые включают все игры моего приложения, другая таблица представляет «шаги» игры (или уровней), где игрок может присоединиться, затем таблицу пользователей, потому что пользователь создает игрока для каждой игры, которая он присоединяется

Так что столы - это игры, шаги, игроки и пользователи. Это таблица игр:

game_id  game_name
1        game1
2        game2

Это таблица шагов (тикет столбца является счетчиком определенного действия, а step_num - столбец для определенного шага по умолчанию):

step_id  step_tickets  step_game  step_num
1        384           1          1
2        742           1          2
3        21            2          1

И это таблица игроков

player_id  player_step  player_user
1          2            1

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

Я хотел бы получить пошаговые инструкции из таблицы шагов в зависимости от данный пользователь и игра. Например, если я даю пользователю 1 и игру 1, я хочу получить строку 2 таблицы шагов, потому что у пользователя 1 есть игрок 1, присоединившийся к шагу 2. Если я даю пользователю 2 и игру 1, у пользователя нет игрока, поэтому по умолчанию я хочу строку 1.

Я использую Mysql версию 5.6

Я пробовал с этим кодом, но ничего ... Кто-нибудь может мне помочь? Заранее спасибо и сообщите мне, если вам нужна другая информация.

SELECT 
    p.tickets AS mytickets, 
FROM games 
LEFT JOIN 
( 
    SELECT 
        IF(t.step_tickets IS NULL, d.step_tickets, t.step_tickets) AS tickets,
        IF(t.step_game IS NULL, d.step_game, t.step_game) AS step_game,
        IF(t.step_id IS NULL, d.step_id, t.step_id) AS step_id
    FROM steps
    LEFT JOIN
    ( 
        SELECT 
            `step_tickets`, 
            `step_game`, 
            `step_id`,
        FROM steps 
        INNER JOIN players ON (players.player_step=step_id AND players.player_user=1)
    ) 
    AS t ON t.step_id=steps.step_id
    LEFT JOIN
    ( 
        SELECT 
            `step_tickets`, 
            `step_game`, 
            `step_id` 
        FROM steps 
        WHERE `step_num`=1 
    ) 
    AS d ON d.step_id=steps.step_id
    GROUP BY step_id
) 
AS p ON p.step_game=games.game_id
WHERE game_id=1

1 Ответ

1 голос
/ 30 января 2020

Если я правильно понимаю, вы хотите одну строку из steps. Этот ряд должен соответствовать игре. И, если возможно, также соответствует пользователю. Если пользователя нет, вы можете вернуть его.

Если это так:

select s.*
from steps s left join
     players p
     on p.player_step = s.step_id
where s.step_game = $game and
      (p.user_id = $user or p.user_id is null)
order by (p.user_id is not null) desc
limit 1;
...