2017-02-20 8 views
0

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

Некоторая информация о структуре квеста. Она находится в трехуровневом порядке со многими квестами за уровень. В пределах квеста есть много Заданий для каждого NPC, которые должны быть завершены, но в хронологическом порядке. Также показано на рисунке:

enter image description here

Мой текущий макет дизайна следующим использованием MySQL:

CREATE TABLE NPCs (
    ID int AUTO_INCREMENT, 
    Name varchar(50), 
    RoomID int, 
    X int(2), 
    Y int(2), 
    TypeID int, 
    ImageID int, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (ImageID) REFERENCES Images(ID) 
     ON UPDATE CASCADE, 
    FOREIGN KEY (TypeID) REFERENCES NPCTypes(ID) 
     ON UPDATE CASCADE, 
    FOREIGN KEY (RoomID) REFERENCES Rooms(ID) 
     ON UPDATE CASCADE 
); 

CREATE TABLE Quests (
    ID int AUTO_INCREMENT, 
    QuestNumber int, 
    Name varchar(50), 
    NPCID int, 
    RewardXP int(3) 
    RewardMoney int(3), 
    LevelID int, 
    Text varchar(100), 
    CompletedText varchar(100), 
    PRIMARY KEY(ID), 
    FOREIGN KEY (LevelID) REFERENCES Levels(ID) 
     ON UPDATE CASCADE, 
    FOREIGN KEY (NPCID) REFERENCES NPCs(ID) 
     ON UPDATE CASCADE 
); 

CREATE TABLE QuestStages (
    ID int AUTO_INCREMENT, 
    UserID int, 
    QuestID int, 
    Accepted bool, 
    Complete bool, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (UserID) REFERENCES Users(ID) 
     ON UPDATE CASCADE, 
    FOREIGN KEY (QuestID) REFERENCES Quests(ID) 
     ON UPDATE CASCADE 
); 

CREATE TABLE LinkedQuests (
    ID int AUTO_INCREMENT, 
    QuestID int, 
    PreQuestID int, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (QuestID) REFERENCES Quests(ID) 
     ON UPDATE CASCADE, 
    FOREIGN KEY (PreQuestID) REFERENCES Quests(ID) 
     ON UPDATE CASCADE  
); 

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

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

Список не завершена Квесты Квесты с использованием UserID (Quests.ID, Quests.Accepted, Quests.Name, Quests.Text, Quests.RoomID, Quests.RewardMoney, Quests.RewardXP)

Сведения о выборе Quest с использованием ID (Quests.ID, Quests. Имя, Quest.Text/Quest.CompletedText // основывается, если завершено или нет // Quests.RewardMoney, Quests.RewardXP)

Подробная информация о квесты в комнате и в порядке д NPC, используя RoomID (Quests.ID, Quests.Accepted, NPCs.ID AS NPCID, NPCs.X, NPCs.Y)

РЕДАКТИРОВАТЬ Вот пример

Quests 
ID | QuestNumber | Name  | NPCID | RewardXP | RewardMoney | LevelID | Text  | CompletedText 
1 | 1   | "Quest1" | 1  | 10  | 10  | 1  | "do this" | "Well Done" 
2 | 2   | "Quest2" | 1  | 10  | 10  | 1  | "do this" | "Well Done" 
3 | 3   | "Quest3" | 2  | 10  | 10  | 1  | "do this" | "Well Done" 
4 | 4   | "Quest4" | 2  | 10  | 10  | 1  | "do this" | "Well Done" 
5 | 5   | "Quest5" | 2  | 10  | 10  | 1  | "do this" | "Well Done" 
6 | 6   | "Quest6" | 3  | 10  | 10  | 1  | "do this" | "Well Done" 

NPCs 
ID | RoomID 
1 | 1 
2 | 1 
3 | 2 

QuestStages 
ID| UserID | QuestID | Accepted | Complete 
1 | 1  | 2  | TRUE  | FALSE 
2 | 1  | 3  | TRUE  | TRUE 
3 | 1  | 4  | FALSE | FALSE 
4 | 1  | 5  | TRUE  | TRUE 
5 | 1  | 6  | TRUE  | FALSE 

LinkedQuests 
QuestID | PreQuestID 
2  | 1 
5  | 4 
4  | 3 

Показаны список заданий для пользователя. ID 1 1

Quests.ID| Quests.Accepted| Quests.Name| Quests.Text| Quests.RoomID| Quests.RewardMoney | Quests.RewardXP 
3  | TRUE   | "Quest3" | "do this" | 1   | ... 

// will not show Quest 2 as is completed 
// will not show Quest 4 as it is dependent on quest 3 being completed 
+0

ли вы имеете в виду 'RPG = Отчет о реализации программы Generator'? или «Ролевые игры»? Потому что, если это второй случай, вы используете неправильный тег. –

+0

Покажите нам пример данных и ожидаемый результат. \t Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

Sorry, имею ввиду Ролевые игры –

ответ

0

DEMO Здесь вы можете увидеть шаг в середине, чтобы достичь окончательного запроса.

-- Final Output, Join to get quest details 
SELECT QS.`QuestID`, QS.`Accepted`, Q.`Name`, Q.`Text`, Q.`RewardMoney` 
FROM QuestStages QS 
LEFT JOIN LinkedQuests LQ 
    ON QS.`QuestID` = LQ.`QuestID` 
LEFT JOIN QuestStages Pre 
    ON QS.`UserID` = Pre.`UserID` 
AND LQ.`PreQuestID` = Pre.`QuestID` 
JOIN Quests Q 
    ON QS.`QuestID` = Q.`QuestNumber` 
WHERE QS.`UserID` = 1 
    AND QS.`Complete` = 'FALSE' 
    AND (Pre.`Complete` = 'TRUE' OR Pre.`Complete` IS NULL) 
    -- Prerequirement is complete or doesnt have Prerequirement 
ORDER BY QS.`QuestID` 
    ; 

ВЫВОД, я сделал три шага для отладки.

enter image description here

+0

у вас есть шанс проверить мое решение? –

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