选择行号等于其他表中某个值的行

时间:2018-12-02 18:58:40

标签: mysql user-variables

我有两个表:游戏和任务

游戏看起来像这样:

| 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,我想从任务中选择manualTask​​类型的第三行。因为它实际上是id = 4的行,所以我不能在WHERE子句中使用id。

我已经实现的是:

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

这是where子句中的“未知列'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并且不知道如何解决它以来已经有一段时间了。我还认为要制作两个表-manualTask​​s和autoTasks而不是任务,因此它可以通过常见的select taskContent from autoTasks a LEFT JOIN game ON a.id = game.autoTaskCounter

解决问题

1 个答案:

答案 0 :(得分:0)

要实现目标,首先需要为手动自动任务制作派生表。接下来的查询将使这些表也累加行号:

带有手动任务的表

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表联接起来:

使用manualTaskCounter字段选择手动任务编号X

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

使用autoTaskCounter字段选择自动任务编号X

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 Example