Попытка создать базу данных для отслеживания статистики с помощью хранимой процедуры.

Я использую хранимую процедуру, чтобы (попытаться) записать в 3 разные таблицы в MYsql, чтобы отслеживать данные пинг-понга и показывать классную статистику.

Так что я полный новичок в MySQL (и в Stackru) и до сих пор не делал никакого языка баз данных, так что все это довольно ново для меня. Я пытаюсь создать хранимую процедуру, которая записывает статистику для пинг-понга, полученную из Ignition (я вполне уверен, что с зажиганием не проблема. Он сообщает мне, что запись не удалась, поэтому я думаю, что это проблема с моей хранимой процедурой),

В настоящее время у меня есть одна хранимая процедура, которая записывает в таблицу игроков и может добавлять выигрыши, проигрыши и общее количество игр, сыгранных при нажатии кнопки. Моя проблема сейчас в том, что я хочу добавить статистику, где я могу отслеживать счет и кто играл против кого, чтобы я мог создавать графики и прочее.

Предполагается, что эта хранимая процедура выполняет поиск в таблице пинг-понга, чтобы выяснить, играли ли переданные имена друг с другом раньше, чтобы я мог найти соответствующий MatchID. Если игроки не играли раньше, то он должен создать новую строку с новым MatchID(это ключ, поэтому он должен быть уникальным каждый раз). После того, как у меня будет MatchID, я смогу выяснить, сколько игр игроки играли друг против друга прежде, каков был счет, и кто кого побил и тому подобное.

Вот что я написал, и MySQL говорит, что это нормально, но, очевидно, это не работает. Я знаю, что он еще не полностью закончен, но мне действительно нужны некоторые рекомендации, поскольку я уже второй раз что-то делаю с MySQL или с языком баз данных в этом отношении, и я не думаю, что это должно провалиться, когда я тестирую какую-либо запись.

CREATE DEFINER=`root`@`localhost` PROCEDURE `Matchups`(
#these are passed from Ignition and should be working
IN L1Name VARCHAR(255), #Player 1 name on the left side
IN L2Name VARCHAR(255), #Player 2 name on the left side
IN R1Name VARCHAR(255), #Player 3 name on the right side
IN R2Name VARCHAR(255), #Player 4 name on the right side
IN TWOvTWO int, #If this is 1, then L1,L2,R1,R2 are playing instead of L1,R1
IN LeftScore int,
IN RightScore int)

BEGIN
DECLARE x int DEFAULT 0;
IF((
SELECT MatchupID
FROM pingpong
WHERE (PlayerL1 = L1Name AND PlayerR1 = R1Name) OR (PlayerL1 = R1Name AND PlayerR1 = L1Name)
) 
IS NULL) THEN 
    INSERT INTO pingpong (PlayerL1, PlayerL2, PlayerR1, PlayerR2) VALUES (L1Name, L2Name, R1Name, R2Name);
    INSERT INTO pingponggames (MatchupID, Lscore, Rscore) VALUES ((SELECT MatchupID
    FROM pingpong
    WHERE (PlayerL1 = L1Name AND PlayerR1 = R1Name) OR (PlayerL1 = R1Name AND PlayerR1 = L1Name)), LeftScore, RightScore);
END IF;
END

Вот как выглядят мои таблицы:

pingpong
PlayerL1 | PlayerL2 | PlayerR1 | PlayerR2 | MatchupID
-----------------------------------------------------
L1       | NULL     | R1       | NULL     | 1
L1       | NULL     | L2       | NULL     | 3
L1       | NULL     | R2       | NULL     | 4
L1       | NULL     | test2    | NULL     | 5
pingponggames
GameID   | MatchupID | LScore   | RScore 
------------------------------------------
1        | 1         | NULL     | NULL     
pingpongplayers
Name     | TotalWins | TotalLosses | GamesPlayed 
-----------------------------------------------------
L1       | 8         | 5           | NULL     
L2       | 1         | 1           | NULL     
R1       | 1         | 6           | 7     
R2       | 1         | 1           | NULL     
test2    | 1         | 0           | 1     
test1    | 0         | 0           | 0

1 ответ

Решение

Объяснил некоторые особенности, если нужно больше, мне нужно больше информации

CREATE DEFINER=`root`@`localhost` PROCEDURE `Matchups`(
#these are passed from Ignition and should be working
IN L1Name VARCHAR(255), #Player 1 name on the left side
IN L2Name VARCHAR(255), #Player 2 name on the left side
IN R1Name VARCHAR(255), #Player 3 name on the right side
IN R2Name VARCHAR(255), #Player 4 name on the right side
-- what will be the INPUT other than 1? It's to notice doubles or singles right? so taking 0 as single & 1 as doubles
IN TWOvTWO INT, #If this is 1, then L1,L2,R1,R2 are playing instead of L1,R1 
IN LeftScore INT,
IN RightScore INT)

BEGIN
DECLARE x INT DEFAULT 0; # i guess you are using it in the sp 
DECLARE v_matchupid INT; #used int --if data type is different, set as MatchupID column datatype
DECLARE inserted_matchupid INT; -- use data type based on your column MatchupID from pingpong tbl

IF(TWOvTWO=0) THEN -- for singles
#what is the need of this query? to check singles or doubles? Currently it search for only single from what you have written, will change according to that 
SELECT MatchupID INTO v_matchupid
FROM pingpong
WHERE L1Name IN (PlayerL1, PlayerR1) AND R1Name IN (PlayerL1, PlayerR1); # avoid using direct name(string) have a master tbl for player name and use its id to compare or use to refer in another tbl
# the if part checks is it new between them and insert in both tbls
    IF(v_matchupid IS NULL) THEN 
        INSERT INTO pingpong (PlayerL1, PlayerR1) VALUES (L1Name, R1Name);
        SET inserted_matchupid=LAST_INSERT_ID();
        INSERT INTO pingponggames (MatchupID, Lscore, Rscore) VALUES (inserted_matchupid, LeftScore, RightScore);
    /*
    Once I have the MatchID, I can then figure out how many games the players have played against each other before 
    A: this will not work for new matchup since matchupid is created now
    */
    # so assuming if match found update pingponggames tbl with matched matchupid.. i leave it up to you 
    ELSE
        UPDATE pingponggames SET Lscore=LeftScore, Rscore=RightScore WHERE MatchupID=v_matchupid;-- you can write your own 
    END IF;
-- for doubles
ELSE # assuming the possibilities of TWOvTWO will be either 0 or 1 if more use "elseif(TWOvTWO=1)" for this block as doubles
    SELECT MatchupID INTO v_matchupid
    FROM pingpong
    # Note: If player name are same it will be difficult so better use a unique id as reference
    WHERE   L1Name IN (PlayerL1, PlayerL2, PlayerR1, PlayerR2) AND
            L2Name IN (PlayerL1, PlayerL2, PlayerR1, PlayerR2) AND
            R1Name IN (PlayerL1, PlayerL2, PlayerR1, PlayerR2) AND
            R2Name IN (PlayerL1, PlayerL2, PlayerR1, PlayerR2);

    IF(v_matchupid IS NULL) THEN
        INSERT INTO pingpong (PlayerL1, PlayerL2, PlayerR1, PlayerR2) VALUES (L1Name, L2Name, R1Name, R2Name);
        SET inserted_matchupid=LAST_INSERT_ID();
        INSERT INTO pingponggames (MatchupID, Lscore, Rscore) VALUES (inserted_matchupid, LeftScore, RightScore);
    ELSE
        UPDATE pingponggames SET Lscore=LeftScore, Rscore=RightScore WHERE MatchupID=v_matchupid;-- you can write your own 
    END IF;

END IF;
END
Другие вопросы по тегам