Найти пользователя с наибольшим количеством контактов - PullRequest
1 голос
/ 24 января 2010

Пользователи отправляют сообщения в окна сообщений друг друга, как найти пользователя, который знает большинство других пользователей (получать и отправлять ??). У меня есть SQL Server.

Таблица:

  • USER_ID
  • USER_NAME
  • user_group
  • MESSAGE_ID
  • MESSAGE_MESSAGE
  • MESSAGE_FROM_USER
  • M_ESSAGE_TO_USER

Пользователь может отправлять и получать, так что, кто знает больше других пользователей (отправлять и получать ??)

Ответы [ 2 ]

3 голосов
/ 24 января 2010

SQL Server 2005+, с использованием CTE:


 WITH usr_list AS (
   SELECT x.user_id,
          x.message_from_user AS other_user
     FROM TABLE x
   UNION
   SELECT y.user_id,
          y.message_to_user AS other_user
     FROM TABLE y)
  SELECT TOP 1
         ul.user_id,
         COUNT(*) AS num_friends
    FROM usr_list ul
GROUP BY ul.user_id
ORDER BY num_friends DESC

Не эквивалент CTE:


  SELECT TOP 1
         ul.user_id,
         COUNT(*) AS num_friends
    FROM (SELECT x.user_id,
                 x.message_from_user AS other_user
            FROM TABLE x
          UNION
          SELECT y.user_id,
                 y.message_to_user AS other_user
            FROM TABLE y) ul
GROUP BY ul.user_id
ORDER BY num_friends DESC
2 голосов
/ 25 января 2010

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

SELECT TOP 1
  user_id,
  friend_count = COUNT(DISTINCT u)
FROM
(
  SELECT user_id,
    u = message_from_user
    FROM table
  UNION ALL
  SELECT user_id,
    u = message_to_user
    FROM table
) AS x
ORDER BY friend_count DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...