如果未找到连接,如何使用 DB::table 和 orderBy 可连接属性集 0 连接

How to join with DB::table and orderBy jointable attribute set 0 if no join found

我有一个要加入的 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 个条目的 table。在这 1000 个中,只有 100 个在联接 table 中有一行。我想根据只有 100 个属性的值对 1000 个结果进行排序。在联接 table 中没有一行的 900 个其他条目需要为它们不存在的特定属性 (d_scores.totalscore) 获取值 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 将确保结果将显示 table A 中的所有条目,无论它们是否在 table B 中匹配。 如果 table B 中没有匹配项,则表示结果中没有 B.field_that_might_be_matched 的值。默认情况下,mysql 会放 NULL。
ISNULL 条件会将其从 NULL 变为 0.
ORDER BY 2,按 select 列表中的第二个字段排序(在这里查看我,自从我使用这种语法以来已经有一段时间了)。
遗憾的是,我不支持 PHP 中的这种伪 MySQL,这看起来很聪明,但实际上并非如此。所以这个例子是纯粹的SQL。我认为它很容易翻译成你使用的“ORM”。