Поиск пользователей с аналогичными специальностями (числовыми) как текущий пользователь - PullRequest
0 голосов
/ 24 января 2012

В моей базе данных есть две таблицы

таблица пользователей:

+-----------+---------------------+---------+---------+ 
| id        | username            | article | date    |
+-----------+---------------------+---------+---------+
|         1 | max                 |      2  |392185767| 
+-----------+---------------------+---------+---------+
|         2 | alex                |      3  |392333337| 
+-----------+---------------------+---------+---------+

таблица user_specialtys:

+-----------+---------------------+ 
| spc_id    | user_id             | 
+-----------+---------------------+
|         1 | 1                   |     
+-----------+---------------------+
|         2 | 1                   |     
+-----------+---------------------+
|         3 | 1                   |     
+-----------+---------------------+
|         1 | 2                   |     
+-----------+---------------------+

и есть третья таблица с идентификатором и названием каждой специальности, которая не важна.

Как видите, у каждого пользователя может быть много разных специальностей.Теперь в каждом профиле пользователя я хочу показать список похожих пользователей (по специальности!).Что-то вроде:

$user_speciltys_in_array = $user->get_thisUser_specialtys();
$sql = "select `usrname` from users join user_specialtys " .
          "where 'they have most similarity to $user_specialtys_in_array'";

Я не уверен, как это сделать.

Ответы [ 2 ]

0 голосов
/ 24 января 2012

РЕДАКТИРОВАТЬ : Ой! Я не читал вопрос внимательно! Вы хотели имена пользователей! Поэтому нам нужно обернуть указанный выше запрос как подзапрос и использовать user_id s для точного определения имен пользователей. (Изменено ниже.)

Давайте посмотрим на идентификаторы пользователей, посчитав количество подходящих специальностей. Мы создадим наш SQL-запрос, используя $user_speciltys_in_array:

$user_speciltys_in_array = $user->get_thisUser_specialtys();

$sql = 'SELECT users.user_id, score, username FROM (' .
          'SELECT user_id, COUNT(user_id) AS score FROM user_speciality';
$first = 1;
foreach ($user_speciltys_in_array as $spc_id)
{
   $sql = $sql . (($first==1) ? ' WHERE ' : ' AND ';
   $first = 0;
   $sql = $sql . "(user_speciality.spc_id=$spc_id)";
}
$sql = $sql . ' GROUP BY user_id ORDER BY score DESC LIMIT 10) userscores ';
$sql = $sql . ' LEFT JOIN users ON userscores.user_id = users.user_id';

Например, если $user_speciltys_in_array равно array(1,2), вы получите следующие результаты:

user_id  score  username
-------  -----  --------
      1      2  max
      2      1  alex
      3      1  thirdguy

Я добавил ORDER BY score DESC и LIMIT 10, чтобы просто получить 10 самых подходящих пользователей, что часто и ищут люди в системе рекомендаций (краткий список рекомендаций).

0 голосов
/ 24 января 2012

Попробуйте этот запрос,

SELECT 
  `user_speciality`.`user_id`,
  `users`.`username`,
  `user_speciality`.`spc_id` 
FROM
  `test`.`users` 
  INNER JOIN `test`.`user_speciality` 
    ON (
      `users`.`id` = `user_speciality`.`user_id`
    ) 
ORDER BY `user_speciality`.`user_id`;
...