Получить всех пользователей, удовлетворяющих обоим языковым фильтрам - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы захватить всех пользователей, которые говорят 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.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 20 сентября 2018

Попробуйте что-то вроде этого, я прокомментировал в запросе, поэтому, пожалуйста, дайте мне знать, если это даст вам представление о том, как его использовать.

Выбирает различные идентификаторы пользователей, соответствующие всем пользователям, говорящим на всех языках, предоставленных фильтром.Вы можете получить больше столбцов в предложении 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...