mysql join with condition on子句返回null

mysql join with condition on子句返回null,mysql,Mysql,我正在查询数据库中的一个零件表,在该表中我加入了库存和其他表,以便如果库存没有数量,我可以返回“不可用”以代替数量 我的问题是: select partNumber, 1 as QtyRequired, IFNULL(inventory.Quantity,0) as QtyAvailable,IFNULL(Stagename,"Not Available") as Stagename,IFNULL(LocationName,"Not Available") as LocationName fr

我正在查询数据库中的一个零件表,在该表中我加入了库存和其他表,以便如果库存没有数量,我可以返回“不可用”以代替数量

我的问题是:

select partNumber, 1 as QtyRequired, IFNULL(inventory.Quantity,0) as QtyAvailable,IFNULL(Stagename,"Not Available") as Stagename,IFNULL(LocationName,"Not Available") as LocationName  from parts
left join inventory on parts.partID = inventory.partid
left join locations on inventory.LocationID = locations.LocationID
left join stages on inventory.StageID= stages.StageID and stagename <> 'green'
where assembly is true and parts.partID = 7732
我所期待的是

PartNumber QtyRequired QtyAvailable StageName     LocationName
SENSODINE2   1            0       Not Available   Not Available
为了实现这一目标,我想我会做如下事情:

select partNumber, 1 as QtyRequired, IFNULL(inventory.Quantity,0) as QtyAvailable,IFNULL(Stagename,"Not Available") as Stagename,IFNULL(LocationName,"Not Available") as LocationName  from parts
left join inventory on parts.partID = inventory.partid and stagename <> 'green'
left join locations on inventory.LocationID = locations.LocationID and stagename <> 'green'
left join stages on inventory.StageID= stages.StageID and stagename <> 'green'
where assembly is true and parts.partID = 7732
从零件中选择partNumber、1作为QtyRequired、IFNULL(inventory.Quantity、0)作为QTYAAvailable、IFNULL(Stagename,“不可用”)作为Stagename、IFNULL(LocationName,“不可用”)作为LocationName
parts.partID=inventory.partID和stagename“绿色”上的左连接库存
inventory.LocationID=locations.LocationID和stagename上的左连接位置为“绿色”
左侧连接库存上的阶段。StageID=stages.StageID和stagename“绿色”
其中assembly为true,parts.partID=7732
但这样做让我:

错误代码1054:“on子句”中的未知列“stagename”


只需将
stagename
移动到where子句

SELECT partNumber,
       1                                     AS QtyRequired,
       IFNULL(inventory.Quantity, 0)         AS QtyAvailable,
       IFNULL(Stagename, "Not Available")    AS Stagename,
       IFNULL(LocationName, "Not Available") AS LocationName
FROM parts
         LEFT JOIN inventory ON parts.partID = inventory.partid
         LEFT JOIN locations ON inventory.LocationID = locations.LocationID
         LEFT JOIN stages ON inventory.StageID = stages.StageID
WHERE assembly IS TRUE
  AND parts.partID = 7732
  AND Stagename <> 'green'
选择零件号,
1根据质量要求,
如果null(inventory.Quantity,0)表示QTY可用,
如果将NULL(Stagename,“不可用”)作为Stagename,
IFNULL(LocationName,“不可用”)作为LocationName
从零件
parts.partID=inventory.partID上的左联接库存
inventory.LocationID=locations.LocationID上的左连接位置
inventory.StageID=stages.StageID上的左连接阶段
其中汇编为TRUE
和parts.partID=7732
和Stagename“绿色”
我不相信你可以加入一个别名字段,但你可以随时过滤他们以后


此外,为了避免歧义,最好不要将别名命名为与正在筛选的字段名称相同的名称。调用它
stageNameReadable
或类似的方法将有助于您对字段进行不同的处理,因为作为计算字段,它将具有不同的属性。

只需将
stagename
移到where子句即可

SELECT partNumber,
       1                                     AS QtyRequired,
       IFNULL(inventory.Quantity, 0)         AS QtyAvailable,
       IFNULL(Stagename, "Not Available")    AS Stagename,
       IFNULL(LocationName, "Not Available") AS LocationName
FROM parts
         LEFT JOIN inventory ON parts.partID = inventory.partid
         LEFT JOIN locations ON inventory.LocationID = locations.LocationID
         LEFT JOIN stages ON inventory.StageID = stages.StageID
WHERE assembly IS TRUE
  AND parts.partID = 7732
  AND Stagename <> 'green'
选择零件号,
1根据质量要求,
如果null(inventory.Quantity,0)表示QTY可用,
如果将NULL(Stagename,“不可用”)作为Stagename,
IFNULL(LocationName,“不可用”)作为LocationName
从零件
parts.partID=inventory.partID上的左联接库存
inventory.LocationID=locations.LocationID上的左连接位置
inventory.StageID=stages.StageID上的左连接阶段
其中汇编为TRUE
和parts.partID=7732
和Stagename“绿色”
我不相信你可以加入一个别名字段,但你可以随时过滤他们以后


此外,为了避免歧义,最好不要将别名命名为与正在筛选的字段名称相同的名称。调用它
stageNameReadable
或类似的名称将有助于您对字段进行不同的处理,因为作为计算字段,它将具有不同的属性。

根据您的预期输出,您可以实现如下相同的效果:

select partNumber, 1 as QtyRequired, IF(inventory.Quantity is null or stagename = 'green',0,inventory.Quantity) as QtyAvailable,IFNULL(Stagename,"Not Available") as Stagename,IFNULL(LocationName,"Not Available") as LocationName  from parts
left join inventory on parts.partID = inventory.partid
left join locations on inventory.LocationID = locations.LocationID
left join stages on inventory.StageID= stages.StageID
where assembly is true and parts.partID = 7732

我已经更新了
if
条件,如果您不想要stagename
绿色的数据,那么您也可以在
where
子句中设置
stagename“绿色”条件。

根据您的预期输出,您可以实现如下相同的效果:

select partNumber, 1 as QtyRequired, IF(inventory.Quantity is null or stagename = 'green',0,inventory.Quantity) as QtyAvailable,IFNULL(Stagename,"Not Available") as Stagename,IFNULL(LocationName,"Not Available") as LocationName  from parts
left join inventory on parts.partID = inventory.partid
left join locations on inventory.LocationID = locations.LocationID
left join stages on inventory.StageID= stages.StageID
where assembly is true and parts.partID = 7732

我已经更新了
if
条件,如果您不想要stagename
green
的数据,那么您也可以在
where
子句中设置
stagename“green”
条件。

为什么select子句中的
stagename
是大写,但不在on子句中?为什么select子句中的
Stagename
是大写的,而不在on子句中?这将删除所有带有
Stagename='green'
的行,不会给出OP所需的结果(行仍返回,但值已清除)耶@Nick是正确的。将它添加到where子句将删除stagename为
绿色的所有行,并且永远不会返回
不可用的行
这将删除stagename为“绿色”的所有行
,不会给出OP要求的结果(行仍然返回,但值已清除)Yeah@Nick是正确的。将其添加到where子句将删除stagename为绿色的所有行,并且永远不会返回不可用的