сложный запрос SQL, многие ко многим - PullRequest
6 голосов
/ 05 июня 2011

Сложно для меня, так как я новичок в SQL.

У меня есть три таблицы - Peoples, Interests и Peoples_Interests (многие ко многим) - которые связаны следующим образом:

People имеет много от Interests до Peoples_Interests
Interest имеет много от Peoples до Peoples_Interests

Мне нужно предложить предложения народам с наиболее похожими на них народами, что основано на количестве схожих интересов. Так для примера :

Мне интересны бейсбол, футбол и волейбол. Я должен получить предложение с другим пользователем, который имеет столько же интересов, сколько возможно. Люди с 3/3 появлений должны быть тем, что мне нужно, если они существуют (если нет - 2/3 и так далее).

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

UPDATE: Структура БД:

Интересы
ID
имя - строка

Peoples
ID
электронная почта

Peoples_Interests
interests_id
peoples_id

Спасибо.

1 Ответ

3 голосов
/ 05 июня 2011

Как то так.

Select people.id, people.name, count(interest.id)
from people
left join people_interests on people.id = people_interests.peopleid 
left join interests on people_interests.interestid = interests.interest.id
where interests.id in (select id from interests where interests.peopleid = @inputuserid)
group by people.id, people.name
order by count(interest.id)

На английском языке (что может или не может сделать это яснее.)

  • Выберите имя человека и количество его общих интересов
  • Из таблицы людей
  • Присоединиться к таблице интересов так, чтобы эта таблица
  • Это только интересы человека, которому мы пытаемся соответствовать.
  • (группа по людям
  • и порядок по количеству совпадающих интересов.)

Обновлено без подзапроса, но менее ясно

Select people.id, people.name, count(interest.id)
from people
left join people_interests on people.id = people_interests.peopleid 
left join interests on people_interests.interestid = interests.interest.id
inner join interest i2 on (interests.id = i2.id and i2.people_id = @inputuserid)
group by people.id, people.name
order by count(interest.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...