如果没有找到连接,如何与 DB::table 和 orderBy 可连接属性设置 0 进行连接

问题描述 投票:0回答:1

我有一个进行连接的 DB::table 查询。如果无法进行连接,我想将我正在查找的订单属性值设置为 0。在我当前的查询中,没有连接的条目将被忽略。

$d_list = DB::table('d')->where('active', 1)
    ->join('d_scores', 'd_id', '=', 'd.id')
    ->orderBy(DB::raw('(case when d_scores.totalscore is null then 0 else d_scores.totalscore end)'), 'desc')
    ->orderBy('u_24h', 'desc')
    ->orderBy('d.nf', 'desc')
    ->orderBy('d.id', 'desc')
    ->get(array('d.id', 'd_scores.totalscore'));

foreach($d_list as $key => $d){
    if($d->id == $data['d']->id){
        $d_rank = $key+1;
        break;
    }
}

我有一个包含 1000 个条目的表。在这 1000 个中,只有 100 个在连接表中具有行。我想根据只有 100 个属性的值对 1000 个结果进行排序。连接表中没有行的 900 个其他条目需要为它们不存在的特定属性获取值 0 (d_scores.totalscore)。但由于它们不存在连接,因此根本不再采用这些条目。

php mysql sql laravel laravel-5
1个回答
0
投票
SELECT A.id,IFNULL(B.field_that_might_be_matched,0)
FROM table_a A
LEFT JOIN
     table_b B
ON
     A.id = B.table_a_id
ORDER BY 2

LEFT JOIN将确保结果显示表A中的所有条目,无论它们在表B中是否有匹配。如果表B中没有匹配,则意味着B.field_that_might_be_matched没有值在结果中。默认情况下,MySQL 会将 NULL 放在那里。

ISNULL条件会将其从NULL变为0ORDER BY 2,按选择列表中的第二个字段进行排序(在这里检查一下,自从我使用此语法以来已经有一段时间了)。

遗憾的是,我不支持 PHP 中的这种伪 MySQL,这看起来很聪明,但实际上并非如此。所以这个例子是纯 SQL 的。我认为很容易翻译成你使用的“ORM”。

© www.soinside.com 2019 - 2024. All rights reserved.