【问题标题】:Select row where row number is equal to some value from other table选择行号等于其他表中某个值的行
【发布时间】:2018-12-02 18:58:40
【问题描述】:

我有两张桌子:游戏和任务

游戏是这样的:

| 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 我想从任务中选择类型为手动任务的第三行。因为它实际上是 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 而不是 tasks 所以它可以通过常见的select taskContent from autoTasks a LEFT JOIN game ON a.id = game.autoTaskCounter

解决问题

【问题讨论】:

  • 检查这是否是您需要的:db-fiddle.com/f/hTWXZuVJ1dapbu9UY68LvR/0。在这种情况下,我会给出答案,否则,请根据一些数据样本解释您的预期结果。
  • 是的,这完全符合我的要求。谢谢!
  • 很高兴知道,我已经做出了解释。

标签: mysql user-variables


【解决方案1】:

为了接近您的目标,首先您需要为手动自动任务创建派生表。下一个查询将使这些表也将行号相加:

手动任务表

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2019-04-06
    • 2016-07-12
    • 2021-07-11
    相关资源
    最近更新 更多