获取同时满足两种语言过滤条件的所有用户

时间:2018-09-19 21:14:06

标签: mysql laravel

我想吸引所有说PortugueseEnglish的用户。

现在我有以下SQL命令:

SELECT * 
       FROM   `users_language` 
       WHERE  `users`.`id` = 
          `users_language`.`user_id` 
           AND ( `language_id` = 'en'
           OR `language_id` = 'pt' )

我正在使用Laravel作为框架。用户可以添加几种语言作为过滤器,例如PortugueseEnglishGerman等。这就是为什么我有以下代码:

$candidates->whereHas('user.languages', function ($q) use ($request){
                    foreach($request->language as $index => $language_code){
                        $q->where('language_id', $language_code);
//                        $q->where('speaking', '>=', $request->speaking[$index]);
//                        $q->where('writing', '>=', $request->writting[$index]);
//                        $q->where('comprehension', '>=', $request->comprehension[$index]);
                    }
                });

第一个查询是不了解Laravel/PHP的人的简化版本。完整的查询写在下面:

SELECT `user_id`, 
       `cover_letter`, 
       `selected` 
FROM   `jobs_application` 
WHERE  `jobs_application`.`job_id` = ? 
       AND `jobs_application`.`job_id` IS NOT NULL 
       AND EXISTS (SELECT * 
                   FROM   `users` 
                   WHERE  `jobs_application`.`user_id` = `users`.`id` 
                          AND EXISTS (SELECT * 
                                      FROM   `users_language` 
                                      WHERE  `users`.`id` = 
                                             `users_language`.`user_id` 
                                             AND `language_id` = ? 
                                             AND `language_id` = ?))

每当我选择说PortugueseEnglish的用户时,我不会是唯一会讲两种语言的用户。我想检索使用过滤器提供的语言的用户。

我尝试使用whereIn(),但是以后我不能再按speakingwritingcomprehension进行过滤。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

尝试类似的方法,我在查询中添加了注释,因此,请告诉我它是否可以为您提供使用方法的想法。

这将选择与使用过滤器提供的所有语言的所有用户匹配的不同用户ID。您可以在select子句中检索更多列,但还需要在group by子句中使用相同的列。

select u.user_id from users as u
inner join users_language as ul
on ul.user_id = u.user_id
where ul.language_id in (1, 6, 7, 11) # IDs of the languages, you can continue the WHERE clause here by adding AND appending your different cases.
group by u.user_id
having count(ul.language_id) = 4; # number 4 comes from the total count of languages in the IN clause. I have 4 ids there, hence 4 here.