Mysql 如何在计算中从其他表中访问列?
对不起,这个标题。我不知道该怎么说。谢谢 我有一个表,bin_content,它有一个列,LotId,我正试图对它进行计算。计算有点复杂,但我将其归结为以下sql中失败的部分: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; 我想访问当前记录中洛蒂德的值。
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;