Создание представления, где опыт игрока больше, чем требуется опыта уровня таблицы - PullRequest
0 голосов
/ 08 октября 2019

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

Символы таблицы:

+-----+------------+------------+
| id  | name       | experience |
+-----+------------+------------+
| 1   | player 1   | 23         |
+-----+------------+------------+

Уровни таблицы:

+--------+------------+--------------------+
| level  | level_name | minimum_experience |
+--------+------------+--------------------+
| 1      | Beginner   | 0                  |
| 2      | Protector  | 20                 |
| 3      | Warrior    | 40                 |
+--------+------------+--------------------+

Где в качестве представления, которое я хочу создать, это:

+---------------+----------------+------------+-------+----------------------+----------------------+
| character_id  | character_name | level_name | level | character_experience | next_level_experience|
+---------------+----------------+------------+-------+----------------------+----------------------+
| 1             | player 1       | Protector  | 1     | 23                   | 40                   |
+---------------+----------------+------------+-------+----------------------+----------------------+

Один из запросов, которые я использую для представления в настоящее время, но это не такработа.

SELECT
    `experiment`.`characters`.`character_id` AS `character_id`,
    `experiment`.`characters`.`character_name` AS `character_name`,
    `experiment`.`characters`.`experience` AS `current_experience`,
    `experiment`.`levels`.`level` AS `current_level`,
    `experiment`.`levels`.`level_name` AS `level_name`,
    `experiment`.`levels`.`experience` AS `next_levelexp`
FROM
    (
        `experiment`.`characters`
    LEFT JOIN `experiment`.`levels` ON
        (
            (
                `experiment`.`levels`.`experience` < `experiment`.`characters`.`experience`
            )
        )
    )
GROUP BY
    `experiment`.`characters`.`character_id`

Результаты, которые я получаю с запросом выше, являются;enter image description here

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

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Другой вариант - использовать коррелированный подзапрос в предложении SELECT ( Просмотр на скрипте БД ):

Запрос

SELECT c.*
     , (SELECT level_name 
        FROM levels 
        WHERE minimum_experience <= c.experience
        ORDER BY minimum_experience DESC 
        LIMIT 1) AS level_name
     , (SELECT level 
        FROM levels 
        WHERE minimum_experience <= c.experience
        ORDER BY minimum_experience DESC 
        LIMIT 1) AS level
     , (SELECT minimum_experience 
        FROM levels 
        WHERE minimum_experience > c.experience
        ORDER BY minimum_experience ASC 
        LIMIT 1) AS next_levelexp
FROM characters c;

Результат

| id  | name     | experience | level_name | level | next_levelexp |
| --- | -------- | ---------- | ---------- | ----- | ------------- |
| 1   | player 1 | 23         | Protector  | 2     | 40            |
1 голос
/ 08 октября 2019

Рассмотрим следующее:

DROP TABLE IF EXISTS characters;

CREATE TABLE characters
(id SERIAL PRIMARY KEY
,name VARCHAR(12) UNIQUE
,experience INT NOT NULL
);

INSERT INTO characters VALUES
(1,'player 1',23);

DROP TABLE IF EXISTS levels;

CREATE TABLE levels
(level SERIAL PRIMARY KEY
,level_name VARCHAR(12) UNIQUE
,minimum_experience INT NOT NULL
);

INSERT INTO levels VALUES
(1,'Beginner',0),
(2,'Protector',20),
(3,'Warrior',40);

SELECT c.*
     , MAX(x.minimum_experience) minimum_experience
     , MIN(y.minimum_experience) next_level_exp 
  FROM characters c 
  JOIN levels x 
    ON x.minimum_experience <= c.experience 
  LEFT 
  JOIN levels y 
    ON y.minimum_experience > c.experience 
 GROUP 
    BY c.id;
+----+----------+------------+--------------------+----------------+
| id | name     | experience | minimum_experience | next_level_exp |
+----+----------+------------+--------------------+----------------+
|  1 | player 1 |         23 |                 20 |             40 |
+----+----------+------------+--------------------+----------------+

Я пропустил один бит в качестве упражнения для читателя. Подсказка: это связано с другим JOIN.

...