Программирование логики для группирования действий пользователей, таких как Facebook. Например. Крис теперь дружит с A, B и C - PullRequest
0 голосов
/ 26 ноября 2011

Итак, я пытаюсь разработать ленту действий для своего сайта,

В основном, если я UNION соберу группу событий в ленту новостей, я получу что-то вроде следующего.

Крис теперь в друзьях у Марк

Крис теперь в друзьях у Дэйв

Что я хочу, так это более аккуратный способ группировки подобных сообщений, чтобы лента не давала информационной перегрузки ...

Например

Крис теперь дружит с Mark , Dave и 4 Others

Есть идеи о том, как я могу подойти к этому логически?

Я использую классический ASP на сервере SQL.

Вот оператор UNION, который у меня есть ...

SELECT      U.UserID As UserID, L.UN As UN,Left(U.UID,13) As ProfilePic,U.Fname + ' ' + U.Sname As FullName, 'said ' + WP.Post AS Activity, WP.Ctime
FROM         Users AS U LEFT JOIN Logins L ON L.userID = U.UserID LEFT OUTER JOIN
                      WallPosts AS WP ON WP.userID = U.userID WHERE WP.Ctime IS NOT NULL
UNION
SELECT     U.UserID As UserID, L.UN As UN,Left(U.UID,13) As ProfilePic,U.Fname + ' ' + U.Sname As FullName, 'commented ' + C.Comment AS Activity, C.Ctime
FROM         Users AS U LEFT JOIN Logins L ON L.userID = U.UserID LEFT OUTER JOIN
                      Comments AS C ON C.UserID = U.userID WHERE C.Ctime IS NOT NULL
UNION
SELECT     U.UserID As UserID, L.UN As UN,Left(U.UID,13) As ProfilePic, U.Fname + ' ' + U.Sname As FullName, 'connected with <a href="/profile.asp?un='+(SELECT Logins.un FROM Logins WHERE Logins.userID = Cn.ToUserID)+'">' + (SELECT Users.Fname + ' ' + Users.Sname FROM Users WHERE userID = Cn.ToUserID) + '</a>' AS Activity, Cn.Ctime
FROM         Users AS U LEFT JOIN Logins L ON L.userID = U.UserID LEFT OUTER JOIN
                      Connections AS Cn ON Cn.UserID = U.userID WHERE CN.Ctime IS NOT NULL

1 Ответ

1 голос
/ 28 ноября 2011

Просто общий совет: вы не должны использовать логику отображения в своих SQL-запросах. Например, вы пишете <a> теги и HTML внутри вашего кода SQL, который, я думаю, широко осуждается. Кроме того, я думаю, что решение вашей проблемы должно быть в конце сценария, а не в запросе SQL.

Что касается вашего конкретного примера, я думаю, что если бы вы заказали U.UserID, вы бы извлекли ваши данные в форму, в которой всегда будут сгруппированы элементы "Крис дружит с ...". Оттуда я буду работать над своей логикой цикла в ASP, так что вместо того, чтобы просто циклически просматривать набор записей и выводить его, я буду проверять каждую запись и смотреть, совпадает ли userID из этой операции с предыдущим userID, а затем просто присоединяться к ним. Так, например, вы можете попробовать следующий (непроверенный) код:

oldID = 0
activityCount = 0
activityStream = ""
Do While Not rs.eof
    If oldID <> rs("ID") Then
        Response.Write(activityStream)
        activityStream = rs("FullName") & " is friends with " & rs("ToUserID")
    Else
        activityCount = activityCount + 1
        If activityCount <= 3 Then
            activityStream = activityStream & ", " & rs("ToUserID")
        Else
            activityStream = activityStream & " and <a href='#'>" & activityCount & "others</a>"
            activityCount = 0
        End If
    End If
    oldID = rs("ID")
rs.Movenext
Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...