我使用的是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,条件进行了数小时的失败尝试......没有工作,但我可能没有正确使用它们。
非常感谢任何帮助。
答案 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' );