我有两个表:游戏和任务
游戏看起来像这样:
| 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并且不知道如何解决它以来已经有一段时间了。我还认为要制作两个表-manualTasks和autoTasks而不是任务,因此它可以通过常见的select taskContent from autoTasks a LEFT JOIN game ON a.id = game.autoTaskCounter
答案 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
查看下一个在线示例: