Выберите строку, где номер строки равен некоторому значению из другой таблицы - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть две таблицы: игра и задачи

Игра выглядит так:

| step | manualTaskCounter | autoTaskCounter | (and other)
----------------------------------------------------------
|  1   |      3            | 1               | ...
----------------------------------------------------------

Задачи выглядят так:

| id | taskType | taskContent |
-------------------------------
|  1 |    M     | abc         |
|  2 |    M     | cde         |
|  3 |    A     | efg         |
|  4 |    M     | jpq         |

Поскольку задачи выполняются одновременно,ручные (с M taskType) и автоматические (A) задачи, которые я хочу выбрать.Мой API содержит две переменные: mTaskCounter и aTaskCounter.например, если mTaskCounter = 3, я хочу выбрать 3-ю строку типа manualTask ​​из задач.Поскольку это на самом деле строка с id = 4, я не могу использовать id в предложении WHERE.

То, что я уже достиг:

SELECT
    id,
    taskType,
    taskContent,
    (@row:=@row + 1) as rowNumber,
    g.manualTaskCounter as mTaskCounter
FROM
    tasks t,
    (SELECT @ROW:=0) AS r,
    (SELECT manualTaskCounter FROM game) AS g
WHERE
    g.manualTaskCounter = rowNumber

Это говорит "неизвестный столбец" rowNumber "в где

Я также пытался использовать LEFT JOIN:

SELECT
    id,
    taskType,
    taskContent,
    (@row:=@row + 1) as rowNumber,
    g.manualTaskCounter as mTaskCounter
FROM
    tasks t,
    (SELECT @ROW:=0) AS r
LEFT JOIN
    `game` g ON g.manualTaskCounter = rowNumber

Тот же результат. Давно я пользовался mysql каждый день и не знаю, как это исправить. Я также думаю сделать дватаблицы - ручные задачи и автозадачи вместо задач, так что это может решить проблему с помощью общих select taskContent from autoTasks a LEFT JOIN game ON a.id = game.autoTaskCounter

1 Ответ

0 голосов
/ 02 декабря 2018

Для достижения вашей цели сначала вам нужно будет создать производные таблицы для ручных и автоматических задач.Следующие запросы также приведут к тому, что эти таблицы добавят номер строки:

Таблица с ручными задачами

SELECT
    t.id,
    t.taskType,
    t.taskContent,
    (@row_num := @row_num + 1) AS rowNum
FROM
    tasks AS t
CROSS JOIN
    (SELECT @row_num := 0) AS r
WHERE
    taskType = 'M'

Таблица с автоматическими задачами

SELECT
    t.id,
    t.taskType,
    t.taskContent,
    (@row_num := @row_num + 1) AS rowNum
FROM
    tasks AS t
CROSS JOIN
    (SELECT @row_num := 0) AS r
WHERE
    taskType = 'A'

Теперь все, что вам нужно сделать, это объединить эти производные таблицы с таблицей game в соответствующих столбцах:

Выберите ручной номер задачи X, используя поле manualTaskCounter

SELECT
    mTasks.*
FROM
    game AS g
INNER JOIN
    ( SELECT
          t.id,
          t.taskType,
          t.taskContent,
          (@row_num := @row_num + 1) AS rowNum
      FROM
          tasks AS t
      CROSS JOIN
          (SELECT @row_num := 0) AS r
      WHERE
           taskType = 'M' ) AS mTasks ON mTasks.rowNum = g.manualTaskCounter

Выберите автоматический номер задачи X, используя поле autoTaskCounter

SELECT
    aTasks.*
FROM
    game AS g
INNER JOIN
    ( SELECT
          t.id,
          t.taskType,
          t.taskContent,
          (@row_num := @row_num + 1) AS rowNum
      FROM
          tasks AS t
      CROSS JOIN
          (SELECT @row_num := 0) AS r
      WHERE
           taskType = 'A' ) AS aTasks ON aTasks.rowNum = g.autoTaskCounter

Проверьте следующий онлайн-пример:

Пример DB Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...