Mysql SQL按元表列排序,包括不带元项的列

Mysql SQL按元表列排序,包括不带元项的列,mysql,sql,laravel,Mysql,Sql,Laravel,我正在使用Laravel查询生成器。但我想我的问题只是与SQL有关 我有一个responses表和一个responses\u metas表 其中,response\u metas表结构为: id | response_id |  name |  value ----------------------------------------------------- 所有的回复都有一些元条目,一些条目的名称为=emailmeta 我有没有办法得到: 附有电子邮件(me

我正在使用Laravel查询生成器。但我想我的问题只是与SQL有关

我有一个
responses
表和一个
responses\u metas

其中,
response\u metas
表结构为:

 id   |   response_id    |    name    |    value
-----------------------------------------------------
所有的回复都有一些元条目,一些条目的名称为=emailmeta

我有没有办法得到:

附有电子邮件(meta)并由该meta排序的响应。以及那些没有名称=电子邮件元条目的

我可以做一个简单的连接:

DB::table('responses')
 ->join('response_metas', 'responses.id', '=', 'response_metas.response_id');
 ->where( 'response_metas.name', 'email')
 ->orderBy( 'response_metas.value', 'ASC' )
但很明显,我得到的回复只有一封邮件。目标是首先得到这个结果但也包括没有此元条目的条目。

如果我能带来任何澄清,请告诉我。我用联盟、案例、条件做了数小时失败的尝试。。。没有一个有效,但我可能没有正确使用它们

非常感谢您的帮助

如果您希望所有元数据都用于响应,并像电子邮件元数据一样排序,则应首先显示/排序元数据,然后是其余元数据,然后您可以使用条件排序方式

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')

要获得所有回复,或者他们有/没有电子邮件元数据,您可以使用left join并将条件直接放入join部分

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' );

没有得到你需要的东西?你想要回复的所有数据,或者它包含name=email,或者不是esleYes,所有回复,是否包含meta-email。只有那些首先出现元电子邮件的人。使用left join而不是join,这不会改变任何事情:/Thank感谢您的帮助,Thank,Thank,Thank,Thank,Thank,您可以再做一件事吗?举个例子,例如,两个表中都有哪些数据,您想要什么,以及您现在得到什么,以便更好地了解银行,那么我应该只保留join和条件orderByRow('CASE…')还是其他什么?因为它似乎不起作用。我正在获取所有信息,但那些有电子邮件的信息不会首先显示。@2Fwebd您能为您的表添加示例数据吗?所以我也可以重现这个问题,哈立德,这很有帮助,我就快到了。我唯一剩下的问题是,我得到的是每个回复一行,而不是每个回复一行,这有意义吗?如果我是groupBy('responses.id'),我得到的只是第一个不是电子邮件的元。@2Fwebd我已经更新了我的答案,我不明白你的意思。希望这有帮助