2013-11-24 9 views
2

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

|id|hobby |person |enjoyment 
------------------------------- 
| |soccer |john |10 
| |soccer |jake |5 
| |baseball |john |3 
| |baseball |nate |5 
| |baseball |jordan |2 
| |tennis |john |3 
| |tennis |nate |7 
| |chess |john |10 
| |chess |nate |3 

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

Предоставлено 1 человеку, мне нужно знать, кто, по крайней мере, участвует в самых похожих хобби. В приведенном выше примере, если бы я выбрал Джона, он должен установить Nate как (3), поскольку они разделяют 3 общих увлечения (бейсбол, теннис и шахматы), джейк и иордан оба получат (1)

Я мог бы сделать это с несколькими запросами, конечно ...

SELECT hobbies FROM tblname WHERE person='john'; 

SELECT person FROM tblname WHERE hobbies='baseball' 
     AND hobbies='tennis' AND hobbies='chess' AND name!='john' 

и продолжайте делать это, но, похоже, НЕВЕРОЯТНО неэффективно.

Есть ли один оптимизированный запрос для создания такого рода материалов?

+1

Да ладно - вы можете сделать это лучше! - и в вашей таблице нет колонки под названием 'hobbies' – Strawberry

ответ

0
SELECT something 
     , COUNT(*) 
    FROM hobbies john 
    JOIN hobbies notjohn 
    ON notjohn.something <> john.something 
    AND notjohn.some_other_thing = john.some_other_thing 
    WHERE john.person = 'x' 
    GROUP 
    BY ?.?; 
0

Итак, вот решение, это сделано с подзапросом, который может быть не самым эффективным способом сделать это.

Я думаю, что запрос сам объясняет.

Вы считаете количество строк, возвращенных туда, где хобби находятся в списке ваших увлечений.

Я предположил, что это будет сделано в каком-то виде, поэтому я мог бы использовать john в предложениях where.

SELECT person, COUNT(*) AS nbrMatches FROM hobbies 
WHERE hobby IN 
       (SELECT hobby FROM hobbies WHERE 
       person='john') 
AND person <> 'john' 
GROUP BY person 
ORDER BY nbrMatches DESC 
0

вы можете проверить его sqlfiddle. http://sqlfiddle.com/#!2/86e74/6/1

SELECT t_other.person, count(*) 
FROM tbl as t_john, tbl as t_other 
WHERE t_john.person = 'john' 
    AND t_other.hobby = t_john.hobby 
    AND t_other.person != 'john' 
GROUP BY t_other.person; 
Смежные вопросы