2011-04-10 27 views
3

快速总结一下:我有一个社交网站,用户可以按照/后/票等我加入一个新的类似Facebook的活动墙功能,每个用户的配置文件。多表联接的返回重复的结果,类似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 

$用户只是$ _GET [ '用户'] 的TIMEAGO()函数,简单地显示非常受欢迎的“xx前发布”日期时间。

<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类。 例如: 如果结果行后,则CSS类的列表项的会,如果结果行是一票,则CSS类的列表项的将是“票” 等是“后”

任何帮助,将不胜感激!

UPDATE:好多个查询似乎正常工作......没有更多的重复。我甚至有它只显示最近几个月的活动(现在反正)。现在我需要弄清楚如何混合结果,所以最近的一个(不管是投票还是帖子等)都在顶部。

P.S.我可能应该提到,很多数据将通过这一点(想想一个脸谱墙+微博喂哈哈)

+0

欢迎来到SO!我的建议是将你分解成不同的部分和单独查询。如果没有真正查看结果集,难以查明数据有点困难 – JohnP 2011-04-10 05:43:51

+0

感谢您的快速回复:)我也在考虑这个问题......虽然我不知道如何将它们混合在一起,然后按顺序排列最近的。现在,结果集看起来像这样:post1,post1,显示爱,称为白痴,post2,post2 – Nate 2011-04-10 05:47:44

+0

想想你需要在墙上显示单个项目的东西 - 例如:日期,标题和主体。现在编写单独的SQL查询,为每种类型的对象返回这些列。 – geofftnz 2011-04-10 05:51:43

回答

3

你应该把你的查询变成3个语句的联合(投票,帖子,评论),返回同一组列。查询中发生的事情是,多个投票,帖子或评论将与查询生成的行相乘。

顺便说一句,你应该转换为使用参数化的SQL如果可能的话,以消除潜在的SQL注入漏洞。

+0

谢谢你的建议!但是,使用UNION意味着每个表都需要有相同的列吗? (如果没有,请尽量告诉我)这是不可能的。 – Nate 2011-04-10 05:53:46

+0

你可以重新命名你的查询中的列:'选择p.post_body作为身后p' – geofftnz 2011-04-10 05:54:59

+0

哦,真棒!没有意识到我可以将它们重新命名为相同的:D仅凭这一点我将相信很多,谢谢!现在,如果我这样做,我将如何区分结果输出?例如:我将如何显示vote.date与post.date? – Nate 2011-04-10 05:57:04