SQL表按元表列排序,包括没有元条目的列

时间:2017-12-06 04:55:54

标签: mysql sql laravel

我使用的是Laravel Query Builder。但我想我的问题只是SQL相关。

我有一个responses表和一个response_metas表。

response_metas表结构为:

 id   |   response_id    |    name    |    value
-----------------------------------------------------

所有回复都有一些元条目,有些名称= 电子邮件元。

我有办法得到:

  

通过此元数据附加和订购的电子邮件(元)的回复。以及没有name = email元条目的那些。

我可以做一个简单的加入:

DB::table('responses')
 ->join('response_metas', 'responses.id', '=', 'response_metas.response_id');
 ->where( 'response_metas.name', 'email')
 ->orderBy( 'response_metas.value', 'ASC' )

但显然我只收到有电子邮件元的回复。目标是首先获得此结果。 但也是没有此元条目的人。

如果我能提出任何澄清,请告诉我。我使用UNION,CASE,条件进行了数小时的失败尝试......没有工作,但我可能没有正确使用它们。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果您希望响应的所有元数据和像电子邮件元数据一样有序,则应首先显示/排序,然后是元数据的其余部分,然后您可以通过

DB::table('responses')
     ->join('response_metas', 'responses.id', '=', 'response_metas.response_id');
     ->where( 'response_metas.name', 'email')
     ->orderByRaw('response_metas.name = "email" DESC')
     ->orderBy( 'response_metas.value', 'ASC' )

条件子句,如果等同于以下表达式

->orderByRaw('CASE WHEN response_metas.name = "email" THEN 1 ELSE 0 END DESC')

<击>

要获得所有回复,他们拥有/不拥有电子邮件的元数据,您可以使用左连接并将条件直接放入连接部分

DB::table('responses')
    ->leftJoin('response_metas', function ($join) {
                $join->on('responses.id', '=', 'response_metas.response_id')
                     ->where( 'response_metas.name', 'email');
    })
    ->orderByRaw('CASE WHEN response_metas.value IS NOT NULL THEN 1 ELSE 0 END DESC')
    ->orderBy( 'response_metas.value', 'ASC' );