我想吸引所有说Portuguese
和English
的用户。
现在我有以下SQL命令:
SELECT *
FROM `users_language`
WHERE `users`.`id` =
`users_language`.`user_id`
AND ( `language_id` = 'en'
OR `language_id` = 'pt' )
我正在使用Laravel
作为框架。用户可以添加几种语言作为过滤器,例如Portuguese
,English
,German
等。这就是为什么我有以下代码:
$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` = ?))
每当我选择说Portuguese
和English
的用户时,我不会是唯一会讲两种语言的用户。我想检索使用过滤器提供的语言的用户。
我尝试使用whereIn()
,但是以后我不能再按speaking
,writing
和comprehension
进行过滤。任何帮助将不胜感激。
答案 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.