mysqli子查询未知列
mysqli subquery unknown column
这似乎是一个范围问题 - 子查询中的 select 语句无法识别 table 'candidate':
SELECT
candidate.id AS id,
candidate.image AS image,
candidate.name AS name,
candidate.party AS party,
player.order AS player_order,
c_pcts.pct AS pct
FROM `candidate`
INNER JOIN players player ON player.candidate_id = candidate.id
INNER JOIN lineups lineup ON player.lineup_id = lineup.id
INNER JOIN (
SELECT
pct
FROM candidate_pcts p
INNER JOIN weekly_game game ON p.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
) WHERE p.candidate_id = candidate.id
) c_pcts
WHERE lineup.id = '31'
ORDER BY player.order ASC
给出错误:“ 'where clause' 中的未知列 'candidate.id'。”如果我输入
而不是 "FROM candidate_pcts p"
FROM candidate_pcts p, candidate c
那么它就看不到 'p.weekly_game_id' ...嗯?
似乎我需要以某种方式为子查询确定 'candidate' table,但我正在尝试的一切只会让我更加误入歧途。而且我尝试了一些乱七八糟的事情:tables 的顺序,在我能想到的任何地方明确标识它们,反引号。我应该注意到嵌套子查询就像一个魅力。又来了:
SELECT
pct
FROM `candidate_pcts`
INNER JOIN weekly_game game ON candidate_pcts.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
) WHERE candidate_pcts.candidate_id = '5'
当然有一个硬编码的 id 值。如果需要,我可以在这里提供数据库结构,但这已经很长了。 'weekly_game' table 只是每个候选人每周的一组分数,我们只需要最近一周的分数,因此 'ORDER BY date DESC LIMIT 1' 子句。
非常感谢您的宝贵时间。
表格:
- table
candidate
: {id
, image
, name
, party
}
- table
candidate_pcts
: {id
, candidate_id
, pct
, weekly_game_id
}
- table
lineups
: {id
, date, user_id
}
- table
players
: {id
,candidate_id
,lineup_id
,order
}
- table
weekly_game
: {id
,date
}
你基本上是在解决问题的正确轨道上。本质上,嵌套子 select 不知道 candidate.id
。如果您分解查询并查看有问题的子select:
SELECT
pct
FROM candidate_pcts p
INNER JOIN weekly_game game ON p.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
) WHERE p.candidate_id = candidate.id
您可以看到,除了您的 where 子句之外,在该查询中没有对 candidate
table 的任何引用,因此这是一个未知列。
因为 subselect 本质上是在引用它的外部 select 之前创建的,subselect 必须是一个独立的 executable 查询.
感谢所有人,尤其是 Mike 的出色解释。我所做的是像这样重组查询:
SELECT
candidate.id AS id,
candidate.image AS image,
candidate.name AS name,
candidate.party AS party,
player.order AS player_order,
pcts.pct AS pct
FROM `candidate`
INNER JOIN players player ON player.candidate_id = candidate.id
INNER JOIN lineups lineup ON player.lineup_id = lineup.id
LEFT JOIN (
SELECT
p.candidate_id AS pct_id, pct AS pct
FROM candidate_pcts p
INNER JOIN weekly_game game ON p.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
)
) pcts
ON pct_id = candidate.id
WHERE lineup.id = '$lineup_id'
ORDER BY player.order ASC
这似乎是一个范围问题 - 子查询中的 select 语句无法识别 table 'candidate':
SELECT
candidate.id AS id,
candidate.image AS image,
candidate.name AS name,
candidate.party AS party,
player.order AS player_order,
c_pcts.pct AS pct
FROM `candidate`
INNER JOIN players player ON player.candidate_id = candidate.id
INNER JOIN lineups lineup ON player.lineup_id = lineup.id
INNER JOIN (
SELECT
pct
FROM candidate_pcts p
INNER JOIN weekly_game game ON p.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
) WHERE p.candidate_id = candidate.id
) c_pcts
WHERE lineup.id = '31'
ORDER BY player.order ASC
给出错误:“ 'where clause' 中的未知列 'candidate.id'。”如果我输入
而不是 "FROM candidate_pcts p"FROM candidate_pcts p, candidate c
那么它就看不到 'p.weekly_game_id' ...嗯?
似乎我需要以某种方式为子查询确定 'candidate' table,但我正在尝试的一切只会让我更加误入歧途。而且我尝试了一些乱七八糟的事情:tables 的顺序,在我能想到的任何地方明确标识它们,反引号。我应该注意到嵌套子查询就像一个魅力。又来了:
SELECT
pct
FROM `candidate_pcts`
INNER JOIN weekly_game game ON candidate_pcts.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
) WHERE candidate_pcts.candidate_id = '5'
当然有一个硬编码的 id 值。如果需要,我可以在这里提供数据库结构,但这已经很长了。 'weekly_game' table 只是每个候选人每周的一组分数,我们只需要最近一周的分数,因此 'ORDER BY date DESC LIMIT 1' 子句。
非常感谢您的宝贵时间。
表格:
- table
candidate
:{
id
,image
,name
,party
} - table
candidate_pcts
:{
id
,candidate_id
,pct
,weekly_game_id
} - table
lineups
:{
id
,date, user_id
} - table
players
:{
id
,candidate_id
,lineup_id
,order
} - table
weekly_game
:{
id
,date
}
你基本上是在解决问题的正确轨道上。本质上,嵌套子 select 不知道 candidate.id
。如果您分解查询并查看有问题的子select:
SELECT
pct
FROM candidate_pcts p
INNER JOIN weekly_game game ON p.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
) WHERE p.candidate_id = candidate.id
您可以看到,除了您的 where 子句之外,在该查询中没有对 candidate
table 的任何引用,因此这是一个未知列。
因为 subselect 本质上是在引用它的外部 select 之前创建的,subselect 必须是一个独立的 executable 查询.
感谢所有人,尤其是 Mike 的出色解释。我所做的是像这样重组查询:
SELECT
candidate.id AS id,
candidate.image AS image,
candidate.name AS name,
candidate.party AS party,
player.order AS player_order,
pcts.pct AS pct
FROM `candidate`
INNER JOIN players player ON player.candidate_id = candidate.id
INNER JOIN lineups lineup ON player.lineup_id = lineup.id
LEFT JOIN (
SELECT
p.candidate_id AS pct_id, pct AS pct
FROM candidate_pcts p
INNER JOIN weekly_game game ON p.weekly_game_id = (
SELECT id FROM weekly_game ORDER BY date DESC LIMIT 1
)
) pcts
ON pct_id = candidate.id
WHERE lineup.id = '$lineup_id'
ORDER BY player.order ASC