Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在计算中从其他表中访问列?_Mysql_Sql_Select - Fatal编程技术网

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

Mysql 如何在计算中从其他表中访问列?,mysql,sql,select,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; 我想访问当前记录中洛蒂德的值。

对不起,这个标题。我不知道该怎么说。谢谢

我有一个表,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;
我想访问当前记录中洛蒂德的值。正确的方法是什么

编辑:

以下是实际计算结果:

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;

如果我能让那行返回一个值,其余的就行了。基本思想是bc.LotId在前四位数字YYWW中有一个日期代码,其中YY=年,WW=周数。我正在计算自该日期代码以来经过的月数。

更新问题后编辑的答案:

由于此计算仅依赖于一行,因此可以将所有列移动到内部查询并从中选择:

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
问题是因为bin_内容不在子查询的范围内

删除大量代码后,您的骨架如下所示:

SELECT stuff
FROM(
   SELECT stuff
) x, bin_content bc...
内部select查询中没有FROM子句,因此无法引用bc。查询很复杂,因此我不确定这样做是否有效:

SELECT stuff
FROM(
   SELECT stuff
   FROM bin_content bc
) x, bin_content bc...
但是这个问题肯定是因为bc不在适当的范围内。

希望这有助于:

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;

为什么不选择bc.LotId、bc.ModelId、LEFTbc.LotId、4作为bin_content bc中的日期代码,其中bc.Quantity 0?嗨,@dbinns66,计算实际上要复杂得多。它涉及到大约10项任务,每栋楼都在另一栋楼上。我在这里将其简化为内部选择中的一个任务。嗨,@Jonathan M,这将非常有助于显示整个查询并尽可能多地解释它,以便那些试图帮助的人尽可能完整地了解您的数据和您的最终目标。很抱歉,将其缩减得太多。除了不显示计算结果外,子查询还有什么用途?子查询中的bc.LotId如何与主查询中的bc.LotId绑定?计算实际上要复杂得多。它涉及到大约10项任务,每栋楼都在另一栋楼上。我已经在这里简化为内部选择中的一个赋值。把实际的计算结果公布出来对我有帮助吗?@JonathanM是的,请。我完全赞成,但我担心你过于简化了,以至于失去了你要解决的问题。对此我很抱歉。张贴,嗯。我现在删除的评论中提到的延迟一定是我的客户机上的问题,因为现在它运行得非常快,没有修改。这似乎是正确的方向,但我如何确保子查询中的记录与主查询中的记录相同?也许您可以将bin_content表移动到子查询中,然后从中选择你需要的?我认为@mureinik的回答很好地解决了这个问题。啊,很好。我现在知道了如何确保两项记录匹配。欢迎您,但我想知道您为什么要使用sub qery!查看我的更新,查看编辑到我的帖子中的完整查询。这要复杂得多。我只是使用一个子查询来隐藏一些计算值,这些值虽然有用,但不需要被看到。
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;