Несколько JOIN, с одним столом нужно два раза - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь создать такую ​​ситуацию в своем приложении: есть пользователи, которые могут выбирать языки, на которых они говорят (например, английский, испанский, японский и т. Д.), И пользователи, которые могут подтвердить языки, выбранные другими пользователями (например,в LinkedIn, где вы можете подтвердить навык другого человека).

У меня есть 4 таблицы в DBRM: Users, Languages, Users_Language и Users_Confirmations. Тела:

Users
id name lastname ...

Languages
id name

Users_Languages
user_id language_id

Users_Confirmations
user_id language_id other_id   ------> here other_id refers to Users table, like user_id. They both refer to Users table, since an user can confirm another user

Например: Джон Смит говорит на английском, испанском и датском языках. Люк Ред и Дженнифер Браун подтвердили английский на Джоне Смите.

Теперь я хочу получить всех пользователей, которые, например, подтвердили пользователя с идентификатором «4», и отобразить их в списке HTML. И я хотел бы получить его как с PURE SQL, так и с Laravel (Eloquent или Query Builder).

Заранее спасибо!

1 Ответ

0 голосов
/ 04 октября 2019

Здесь вы должны изменить атрибуты таблицы, чтобы избежать повторения, просто используйте Users_Languages_ID в качестве внешнего ключа для ссылки на таблицу Users_Langages

-- Users_Confirmations
confirmation_id  user_language_id

Вы можете просто использовать Users_Confirmations, и для каждого добавленного подтверждения вывставит строку, содержащую user_language_id

Возвращаясь к вопросу (чтобы получить пользователей, которые подтвердили пользователя с идентификатором "4")

SELECT Users.name, Users.lastname, Languages.name 
FROM Users_Confirmations
JOIN Users_Languages ON Users_Languages.id = Users_Confirmations.user_language_id
JOIN Languages ON Languages.id = Users_Languages.language_id
JOIN Users ON Users.id = Users_Languages.user_id 
WHERE Users_Languages.user_id = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...