如何在计算中从其他表访问列?

时间:2015-05-04 20:15:59

标签: mysql sql select

对不起标题。不太确定如何说出来。编辑赞赏。

我有一个表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 =周数)。我正在计算自该日期代码以来经过的月数。

3 个答案:

答案 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;