【问题标题】:mysql join with condition on clause return nullmysql join with condition on子句返回null
【发布时间】:2019-12-07 03:49:40
【问题描述】:

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

这是我的查询:

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

问题是我不想在舞台名称为绿色时返回数量。

现在我的数据库中有一行 partID 7732,它处于绿色阶段,但它确实有一个位置。我得到的结果是:

PartNumber QtyRequired QtyAvailable StageName     LocationName
SENSODINE2   1            150       Not Available  Warehouse5

我期待的是

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

但是这样做给了我:

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

【问题讨论】:

  • 为什么 Stagename 在 select 子句中是大写的,而在 on 子句中却不是?

标签: mysql


【解决方案1】:

只需将 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'

我不相信您可以加入别名字段,但您以后可以随时过滤它们。

另外,为避免歧义,最好不要将别名命名为与您要过滤的字段的名称相同的名称。将其称为 stageNameReadable 或类似名称将有助于您区别对待该字段,因为它作为计算字段将具有不同的属性。

【讨论】:

  • 这将删除所有带有Stagename = 'green' 的行,而不是像 OP 要求的那样给出结果(该行仍然返回但值被清除)
  • 是的@Nick 是对的。将其添加到 where 子句将删除所有 stagename 为 green 的行,并且永远不会返回 Not Available
【解决方案2】:

根据您的预期输出,您可以实现如下所示:

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 &lt;&gt; 'green' 条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多