Php 多表连接返回重复结果,类似facebook的活动墙

Php 多表连接返回重复结果,类似facebook的活动墙,php,mysql,sql,duplicates,Php,Mysql,Sql,Duplicates,快速总结:我有一个社交网站,用户可以在其中关注/发布/投票等。我正在为每个用户档案添加一个新的类似facebook的活动墙功能 我已经在这方面工作了几天,似乎无法使它正常工作。我想要的是,就像我提到的facebook墙一样……当一个访问者访问一个用户的个人资料时,该用户的活动将显示出来,无论他们最近对一篇文章进行了投票、发表了评论,还是发布了自己的东西,我都希望它显示在他们的个人资料上,当然,最新的条目将显示在顶部 我现在遇到的问题是:它两次显示一些东西,而不是按最近的排序 我在这里使用了3个表

快速总结:我有一个社交网站,用户可以在其中关注/发布/投票等。我正在为每个用户档案添加一个新的类似facebook的活动墙功能

我已经在这方面工作了几天,似乎无法使它正常工作。我想要的是,就像我提到的facebook墙一样……当一个访问者访问一个用户的个人资料时,该用户的活动将显示出来,无论他们最近对一篇文章进行了投票、发表了评论,还是发布了自己的东西,我都希望它显示在他们的个人资料上,当然,最新的条目将显示在顶部

我现在遇到的问题是:它两次显示一些东西,而不是按最近的排序

我在这里使用了3个表,我只发布了我正在使用的列:

Table structure for table votes_posts
Field   Type    Null    Default
indexer int(11) No  
post_id int(11) No  
vote    int(11) No  
user_name   varchar(250)    No  
date    varchar(255)    No  

Table structure for table posts
Field   Type    Null    Default
id  int(11) No  
name    varchar(30) No  
content text    No  
datetimerss varchar(255)    No  
category    int(11) No  

Table structure for table comments
Field   Type    Null    Default
id  int(12) No  
post_id int(12) No  
name    varchar(30) No  
content text    No  
type    varchar(30) No  
datetimerss varchar(255)    No
$users只是$\u GET['user'] timeAgo函数只显示非常流行的发布日期和时间

<ul class="streamActivity">
<?php
$checkActivity = "SELECT votes_posts.post_id, votes_posts.user_name, votes_posts.vote, votes_posts.date, 
                        posts.id, posts.content, posts.name, posts.datetimerss, categories.category, 
                        comments.post_id AS comm_postid, comments.content AS comm_content, comments.name AS comm_name, comments.datetimerss AS comm_date, comments.type 
                        FROM `votes_posts` 
                        LEFT OUTER JOIN `posts` ON votes_posts.post_id = posts.id 
                        LEFT OUTER JOIN `comments` ON posts.id = comments.post_id 
                        LEFT OUTER JOIN `categories` ON posts.category = categories.cat_id  
                        WHERE (votes_posts.post_id = posts.id AND user_name = '$user')
                        OR (comments.post_id = posts.id AND comments.name = '$user')
                        OR (posts.name = '$user') ORDER BY votes_posts.date, posts.datetimerss, comments.datetimerss ASC";
$checkActivityResult = mysql_query($checkActivity);

if (mysql_num_rows($checkActivityResult) > 0) {
    while ($sessionAct = mysql_fetch_array($checkActivityResult)) {
        $category = strtolower($sessionAct['category']);
        $dateVote = timeAgo($sessionAct['date']);
        $datePost = timeAgo($sessionAct['datetimerss']);
        $dateComm = timeAgo($sessionAct['comm_date']);

        $namePost = $sessionAct['name'];
        $nameComm = $sessionAct['comm_name'];
        $nameVote = $sessionAct['user_name'];

        $idVote = $sessionAct['post_id'];
        $idPost = $sessionAct['id'];
        $idComm = $sessionAct['comm_postid'];

        $contentPost = $sessionAct['content'];
        $contentComm = $sessionAct['comm_content'];
        $typeComm = $sessionAct['type'];

        if ($namePost == $user) {
            $classList = 'storyPost';
            $classIcon = 'iconMuttr';

            $name = $namePost;
            $content = $contentPost .' ... read more';
            $datetime = $datePost;
        }

        elseif ($nameComm == $user && $typeComm == "Comment") {
            $classList = 'actionPost';
            $classIcon = 'iconComment';

            $name = $nameComm;
            $content = 'Commented "'. $contentComm .'"';
            $datetime = $dateComm;
        } elseif ($nameComm == $user && $typeComm == "Advice") {
            $classList = 'actionPost';
            $classIcon = 'iconAdvice';

            $name = $nameComm;
            $content = 'gave Advice "'. $contentComm .'"';
            $datetime = $dateComm;
        }

        elseif ($nameVote == $user) {
            if ($sessionAct['vote'] == "1") {
                $classList = 'actionPost';
                $classIcon = 'iconLaughed';

                $name = $nameVote;
                $content = 'Laughed at "'. $contentPost .'"';
                $datetime = $dateVote;
            } elseif ($sessionAct['vote'] == "2") {
                $classList = 'actionPost';
                $classIcon = 'iconLoved';

                $name = $nameVote;
                $content = 'Showed Love on "'. $contentPost .'"';
                $datetime = $dateVote;
            } elseif ($sessionAct['vote'] == "3") {
                $classList = 'actionPost';
                $classIcon = 'iconIdiot';

                $name = $nameVote;
                $content = 'called '. $namePost .' an Idiot for "'. $contentPost .'"';
                $datetime = $dateVote;
            }
        }
?>
    <li class="row-activity <?php echo $classList; ?>">
        <a href="" class="avatar"><img src="/images/avatars/default_male.jpg" /></a>
        <div class="info">
            <div class="userName">
                <a href=""><?php echo $name; ?></a>
            </div>
            <span class="msgBody"><?php echo $content; ?></span>
            <div class="imgTimeStream">
                <span class="img <?php echo $classIcon; ?>"></span>
                <span class="source"><?php echo $datetime; ?></span>
            </div>
        </div>
    </li>
<?php
    }
} else {
    echo '<p>This user has no recent activity.</p>';
}
?>
</ul>
我决不是一个专业的程序员……我所知道的一切都是我在过去一两年里自学的,所以我只能想象这真的有多难看。尽管如此,我每天都在学习,我希望继续:

此外,在每种类型的活动中,在某些方面都会有稍微不同的CSS类。 例子: 如果结果行是post,那么列表项的css类将是post 如果结果行是投票,那么列表项的css类将是投票 等等

任何帮助都将不胜感激

更新:好吧,多个查询似乎工作正常…不再重复。我甚至只展示了最近几个月的活动。现在我需要弄清楚如何混合结果,所以最近的一个结果是投票还是帖子,等等,应该排在最前面


顺便说一句,我可能应该提到,很多数据都会通过facebook墙+twitter feeds lol传递。你应该将你的查询变成一个由3个语句、投票、帖子和评论组成的联合体,返回相同的列集。在您的查询中发生的情况是,多个投票、帖子或评论正在乘以查询生成的行


另外,如果可能的话,您应该转换为使用参数化SQL,以消除潜在的SQL注入漏洞。

欢迎使用SO!我的建议是,您可以将其分解为不同的部分,并分别进行查询。在没有实际查看结果的情况下精确定位数据有点困难。请您快速回答:我也在考虑这个问题……尽管我不确定如何将它们混合在一起,并按最新的顺序排列。现在,我找到的结果集是这样的:post1,post1,表示爱,称为“白痴”,post2,post2在墙上显示单个项目所需的内容的想法-例如:日期、标题和正文。现在编写单独的SQL查询,为每种类型的对象返回这些列。完成后,在每个查询之间添加一个union,并在底部添加一个适当的order by。似乎无法使union正常工作我以前从未使用过它们,这可能就是问题所在,我将尝试@JohnP的建议,并使用3个不同的查询。谢谢你的建议!但是,使用UNION意味着每个表都需要有相同的列,对吗?如果没有,请务必让我知道这是不可能的。您可以在查询中重命名列:选择p.post_body作为body from post pohh,awesome!!我不知道我可以将它们重命名为相同的名称:D我相信,仅此一项就将大有帮助,谢谢!如果我这样做了,我将如何区分结果输出?我如何显示vote.date和post.date?我只是想补充一点,这种类型的数据特别适合缓存。我强烈建议尽可能长时间地缓存结果集。如果你不需要进给精确到秒,考虑缓存它。即使使用寿命很短的缓存也有助于减少运行此查询的次数。若要区分不同的结果输出,请添加另一个仅返回常量的列,例如1表示投票,2表示注释等。然后可以检查该列以区分不同类型的结果。