2013-03-16 4 views
0

У меня есть БД с таблицами, как пользователей, интересов и тегами.Поиска по крайней мере один аналогичный тег, если это возможно

пользователи стол что-то вроде этого:

user_id | name | city 
    15  John  New York 
    18  Helen Virgina 

интересы стол что-то вроде этого:

interest_id | user_id | tag_id 
    1    15   23 
    2    15   24 
    3    15   25 
    4    18   23 
    5    18   27 

теги стол что-то вроде этого:

tag_id | description 
    23  Skiing 
    24  TV 
    25  Movies 
    26  Music 
    27  Seinfeld 

Таблицы говорят, что Джон и Хелен заинтересованы в лыжах.

Я хочу сделать запрос sql, который будет приведен в результате того, что у Джона и Хелен есть 1 аналогичный интерес и эхо их, например;

Helen 1 interest<br /> 
Jack 2 interests<br /> 

Как это сделать?

А также есть ли другие лучшие способы с точки зрения схемы db?

Как новичок, я оглядывался и искал разные реализации, но не смог добиться успеха.

+1

как результат отформатирован? под этим я подразумеваю, какие столбцы вы хотите иметь в списке результатов? –

+0

http://stackoverflow.com/questions/12875040/find-similar-objects-that-share-the-most-tags?rq=1 - это аналогичное решение. – cDima

+0

@JW Я редактировал вопрос. – Sercan

ответ

2

Подсчитать, сколько интересов пользователя имеет общее с другими:

SELECT u2.name, count(*) 
FROM interests AS i1 
     JOIN users AS u1 
     ON u1.user_id = i1.user_id 
     JOIN interests AS i2 
     ON i1.tag_id = i2.tag_id 
     JOIN users AS u2 
     ON u2.user_id = i2.user_id 
      AND u1.user_id <> u2.user_id 
     JOIN tags AS t 
     ON i1.tag_id = t.tag_id 
WHERE u1.name = 'John' 
GROUP BY u2.name; 

http://sqlfiddle.com/#!2/80aad/1

Что касается схемы, таблицы стыка будет иметь больше смысла, если она будет называться users_tags. Также в этой схеме столбцы id не нужны, комбинация (user_id, tag_id) является естественным кандидатом на первичный ключ, и вам все равно нужно поместить индекс UNIQUE.

+0

Где я должен поставить 'DESC', чтобы показать Джеку раньше Хелен, поскольку он разделяет более похожие интересы с Джоном. – Sercan

+0

@Sercan 'ORDER BY COUNT (*) DESC' в самом конце (но до точки с запятой) http://sqlfiddle.com/#!2/80aad/2 –

+0

Работает как шарм. Спасибо за ваш интерес :) – Sercan

Смежные вопросы