2011-04-10 72 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