@someone1 im stacking on stackoverflow RT @someone2 : hello guys what are you doing?
在我以我的方式做之前我想告诉你我的数据库方案
// CID = COMMENT ID, BID = BLOG ID, UID = USER ID
CID BID UID COMMENT
1 1 1 @someone1 im stacking on stackoverflow RT @someone2 : ....
2 1 4 @someone1 im stacking on stackoverflow RT @someone2 : ....
3 1 12 @someone1 im stacking on stackoverflow RT @someone2 : ....
他们使用正则表达式来做这样的@someones名称
preg_match_all("/@[a-zA-Z0-9_]+/", $text, $matches);
然后他们从每个名字
获得@foreach ($matches as $value) {
foreach ($value as $value) {
$usernames[] = substr($value, 1);
}
}
然后他们从数据库中获取UID来做这样的事情
foreach ($username as $value) {
# insert database one by one ? so it will be like the example above
}
然后我们可以输出评论购买UID。
然后somhow我们可以在博客中获得所有评论。 (没有相同的评论)where blog buid = 1
并通过where uid = :uid
向每位用户发送通知。
还有更好的办法吗?像twitter或convore这样的东西?
感谢您查看
Adam Ramadhan
答案 0 :(得分:9)
我已经使用我们用于通信的内部应用程序做了类似的事情。
基本上,您将有两个表:status_updates
和mentions
。每个状态更新都有很多提及。每当有人创建状态更新时,您将其保存到status_updates
表。在此过程中,您还可以使用Regex检测任何@username
“提及”。当您找到提及时,将其添加到mentions
表中。例如,您的mentions
表可能如下所示:
mention_id (Auto-incrementing key) | status_message_id | username_id
这样,如果您想查看状态消息中是否有人提及,您可以在status_messages
表中快速查找,而不是每次都加载状态消息并运行正则表达式。这种方法的另一个好处是它允许您在每个状态消息中有多个提及。只需为每个mentions
创建一条记录。
这是我们设置的基本方式。
编辑:如果您想为给定用户提取“活动源”,仅显示已提及这些用户的状态更新,则可以这样简单:
SELECT * FROM mentions m LEFT JOIN status_messages s ON m.status_message_id = s.id WHERE m.username_id = $username_id
我应该注意到,这不是他们在Twitter上的做法,因为他们正在处理规模问题,这会使这种简单的做事方式变得不可能。但是,如果您不担心扩展到数十万用户,我认为这是最简单的解决方案。如果你是,那么你手上可能会遇到更多问题。
答案 1 :(得分:2)
你可以像bb代码一样使用它,但不要像[foo] [/ foo]那样把它带到@并在空格处结束......在它插入你的数据库之前你需要另一个脚本并打破@在空间之后。并将提到的内容放在一个单独的列中,然后使用bbcodes即时提及
实施例..
if ( strstr("$status", "@") ) {
$explodeat = explode("@", $status);
$explodeat1 = explode(" ", $explodeat[1]);
$status=$explodeat1[0];
}
并将$ status插入数据库中的提及列...之后的BB代码将不会那么难
答案 2 :(得分:1)
我认为在MySQL中,您可以使用DISTINCT
来避免重复行:
有点链接:
SELECT `CID`, `BID`, DISTINCT `COMMENT`
FROM comments
WHERE UID = :uid
AND ##Others clauses for bloc here##