对不起标题。不太确定如何说出来。编辑赞赏。
我有一个表bin_content
,其中有一列LotId
,我正在尝试对其进行计算。计算有点复杂,但我把它归结为下面sql中失败的部分:
SELECT bc.LotId, bc.ModelId, x.datecode FROM (
SELECT
LEFT(bc.LotId,4) as datecode
) x, bin_content bc WHERE bc.Quantity <> 0;
当我跑步时,我得到了:
SQL错误(1109):字段列表中的未知表'bc'。
错误是指第三行代码的引用:
LEFT(bc.LotId,4) as datecode
我想要访问当前记录中LotId
的值。什么是正确的方法?
编辑:
以下是实际计算:
SELECT bc.LotId, bc.ModelId, x.monthAge FROM (
SELECT
@reportdate := CURDATE(),
@datecode := LEFT(bc.LotId,4),
@dcyear := CONCAT("20",LEFT(@datecode,2)),
@dcweek := SUBSTRING(@datecode,3,2),
@dcyearstart := CONCAT(@dcyear,'-01-01'),
@firstWeekLength := MOD((8-DAYOFWEEK(@dcyearstart)),7),
@builddate := ADDDATE(@dcyearstart,IF(@dcweek = 1, 0, @firstWeekLength + (7*(@dcweek-2)))),
@partialmonth := (DAY(@reportdate) - DAY(@builddate))/31,
@monthAge := ((YEAR(@reportdate) - @dcyear) * 12) + (MONTH(@reportdate) - MONTH(@builddate)) + @partialmonth as monthAge
) x, bin_content bc WHERE bc.Quantity <> 0;
以下一行是问题儿童:
@datecode := LEFT(bc.LotId,4),
如果我可以让该行返回一个值,其余的就可以了。基本思路是bc.LotId
的前四位数字为YYWW
,其中YY
=年,WW
=周数)。我正在计算自该日期代码以来经过的月数。
答案 0 :(得分:2)
问题更新后编辑的答案:
由于您只依赖单行进行此计算,因此您可以将所有列移至内部查询并从中进行选择:
SELECT x.LotId,
x.ModelId,
x.monthAge
FROM (SELECT bc.LotId,
bc.ModelId,
@reportdate := CURDATE(),
@datecode := LEFT(bc.LotId,4),
@dcyear := CONCAT("20",LEFT(@datecode,2)),
@dcweek := SUBSTRING(@datecode,3,2),
@dcyearstart := CONCAT(@dcyear,'-01-01'),
@firstWeekLength := MOD((8-DAYOFWEEK(@dcyearstart)),7),
@builddate := ADDDATE(@dcyearstart,IF(@dcweek = 1, 0, @firstWeekLength + (7*(@dcweek-2)))),
@partialmonth := (DAY(@reportdate) - DAY(@builddate))/31,
@monthAge := ((YEAR(@reportdate) - @dcyear) * 12) + (MONTH(@reportdate) - MONTH(@builddate)) + @partialmonth as monthAge
FROM bin_content bc
WHERE bc.Quantity <> 0) x
答案 1 :(得分:1)
问题是因为bin_content
不在子查询的范围内。
删除了很多代码,你有这样的骨架:
SELECT stuff
FROM(
SELECT stuff
) x, bin_content bc...
内部选择查询中没有FROM
子句,因此无法引用bc
。查询很复杂,所以我不确定是否可以这样做:
SELECT stuff
FROM(
SELECT stuff
FROM bin_content bc
) x, bin_content bc...
但问题肯定是由于bc
不在适当的范围内。
答案 2 :(得分:1)
希望这可能有所帮助:
SELECT bc.LotId, bc.ModelId, x.datecode FROM (
SELECT LEFT(bc2.LotId,4) as datecode
From bin_content bc2
WHERE bc2.LotId = bc.LotId
) x, bin_content bc WHERE bc.Quantity <> 0;
更新:我认为为什么这不适用于你的情况?
SELECT bc.LotId, bc.ModelId, LEFT(bc.LotId,4) as datecode
From bin_content bc WHERE bc.Quantity <> 0;