如果一个表列为空,如何从另一个表中获取值

Posted

技术标签:

【中文标题】如果一个表列为空,如何从另一个表中获取值【英文标题】:How to get the value from the other table if one table column is empty 【发布时间】:2019-05-25 09:36:48 【问题描述】:

我的数据库中有两个表

    产品 product_variations

两者都有价格列

如果任何产品有变体,则 产品表price 列将被取消,并且 variation 中的 price 列表会有一些价值。

但如果产品没有变化,那么产品表的 price 列将具有一些值,但 variation 表中的 price 列将没有价值

我想获取所有价格从低到高的产品,反之亦然。

$shopProducts = product::where(
    [
        "publish" => 'PUBLISH',
        'shop_id' => input::get('shopId')
    ]
)->orderBy('price', 'asc')
->paginate(12);

上述查询返回正确的所有产品,并将所有那些有变化且价格列为空的产品放在最后。

但我想要一个查询,它首先检查产品的价格列,如果它为空,然后转到产品变化表并搜索一个值,然后以 desc 或 asc 的形式返回结果。

【问题讨论】:

您是否需要,例如。如果产品的价格为零,那么获取该产品的所有变体并加入结果? 是的,我需要这样的解决方案 【参考方案1】:

我不知道使用查询构建器执行此操作的完全本地方式,但如果您使用的是 sql 数据库,您应该能够使用原始 case 语句执行此操作。比如……

$shopProducts = product::SELECT(
    DB::raw("CASE WHEN product_variations.price IS NULL THEN product.price ELSE product_variations.price END AS price")
)->where(
    [
        "publish" => 'PUBLISH',
        'shop_id' => input::get('shopId')
    ]
)->orderByRaw('CASE WHEN product_variations.price IS NULL THEN product.price ELSE product_variations.price END', 'asc')
->paginate(12);

这应该适用于 mssql 或 mysql,并且大多数数据库都支持某种类型的类似语法。您只需要在您的选择语句中添加任何您想要的其他列。您还需要加入您的 product_variations 表才能使用此方法。

原始选择和原始顺序都绕过 Laravel 的查询构建器并将您的语句直接传递到数据库,因此请注意构建查询的方式。 Laravel 不会为你清理这些。

【讨论】:

以上是关于如果一个表列为空,如何从另一个表中获取值的主要内容,如果未能解决你的问题,请参考以下文章

如果另一列为空,则选择一列

如何从另一个表中获取每个值的计数?

如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?

如果 Oracle OBIEE 中的列为空,则隐藏数据透视表中的列

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

如果列为空,我如何从 Mysql 的另一个表中导入一些列?