我有类似Facebook的通知系统,用户可以根据在哪个特定网站上发布/喜欢/评分的人来获取通知。
当您成为某些内容的创建者或者您使用以下mysql语句发布了特定内容时,您会收到通知:
SELECT
n.`id`,n.`site`,n.`site_id`,n.`creator_uid`,n.`type`,
nu.`id` AS nuid, nu.`uid` AS nu_uid, nu.`date`,
nr.`id` AS nrid, nr.`uid` AS nr_uid, nr.`is_read`,
u.`gender`
FROM `notification` AS n
LEFT JOIN `notification_user` AS nu ON nu.`nid` = n.`id`
LEFT JOIN `notification_read` AS nr ON nr.`nid` = n.`id`
LEFT JOIN `users` AS u ON u.`id` = nu.`uid`
WHERE
nu.`uid` != '".$_SESSION['uid']."' AND nr.`uid` = '".$_SESSION['uid']."'
OR
(
nu.`uid` = '".$_SESSION['uid']."' AND n.`type` = 'credits'
)
ORDER BY date DESC, nu.`id` DESC
LIMIT 7
现在我已经构建了一个朋友系统,我也希望将我朋友的活动显示为通知。我想把它构建到语句中,但是这个语句被加载到整个网站的每一页上,我认为这对于性能来说已经很难了。所以每次都要通过users_friends
表来收集"收集"我想,我的朋友用户ID对于性能来说会更难。所以我想把这个朋友的用户ID数据存储在我的SESSION中,如下所示:
// get friends user ids
$result = mysql_query("SELECT
CASE
WHEN `sent_uid`='".$_SESSION['uid']."' THEN `get_uid`
WHEN `get_uid`='".$_SESSION['uid']."' THEN `sent_uid`
END AS uid
FROM `users_friends` WHERE `status`='1' AND
(`get_uid`='".$_SESSION['uid']."' OR `sent_uid`='".$_SESSION['uid']."')
") or die(mysql_error());
$i=1;
$num_rows = mysql_num_rows($result);
if (!empty($num_rows) && empty($_SESSION['friends']))
{
while ($data = mysql_fetch_assoc($result))
{
$_SESSION['friends'][] = $data['uid'];
}
}
现在我有一个名为$_SESSION['friends']
的数组,其值为" 39,2,49"例如。我现在还没想过在通知查询中实现这个,因为我想首先询问这个尝试是否合理,还是我应该采取其他方式来做到这一点?我很感激任何建议。
答案 0 :(得分:1)
为什么在做得更少并拥有更好的解决方案时会做更多的事情?:)
为什么要用逗号分隔字符串?只需将其存储为数组即可。这样你可以做各种事情,比如search array, etc,当你需要逗号分隔的字符串时,你可以使用implode()
function。
此外,如果如果$ _SESSION ['friends']被填充则不需要查询数据库,请将查询带入条件块。
if (empty($_SESSION['friends'])) {
$result = mysql_query(...);
while ($data = mysql_fetch_assoc($result)) {
$_SESSION['friends'][] = $data['uid'];
}
}
答案 1 :(得分:1)
你可以实现类似的东西,但恕我直言,你需要一个缓存方法。
这取决于几个因素,但作为一般规则,我不会使用会话来存储应该保留的数据。在这种情况下,我会做类似的事情:
通过这种方式,您可以保留数据并避免数据库锤击和会话变通。
只是一个想法,希望它有所帮助或启发。好看!