Mysql查询返回太多行

时间:2014-02-02 03:28:29

标签: php mysql

所以我有3个表都加入了内部,我试图在主页上讨论讨论主题,同时在主页上显示用户名和最新讨论消息。

问题:查询返回附加到所有讨论的所有消息.....我只需要与返回的讨论相关联的最后一条消息。

我整天都在这里,无法弄明白。我尝试过group by但只是在mysqli_fetch_array上给了我一个错误

这是我的代码

$discussionquery = "SELECT discussion_messages.discussion_id, user_profile.first_name, user_profile.last_name, discussion_messages.message_text, case_discussion.discussion_title 
                        FROM `user_profile` 
                        INNER JOIN discussion_messages 
                        ON (user_profile.user_id = discussion_messages.user_id) 
                        INNER JOIN case_discussion 
                        ON (case_discussion.discussion_id = discussion_messages.discussion_id) 
                        WHERE discussion_messages.case_id = '$thecaseid' 
                        ORDER BY discussion_messages.message_id DESC";
    $discussionquerydata = mysqli_query($dbc, $discussionquery); 

    while ($row2 = mysqli_fetch_array($discussionquerydata)) {
    $discussion_id = $row2['discussion_id'];

    ?>
    <!-- Begin Recent Discussions -->  
    <div class="row">
      <a href="discussion.php?newfact=$thecaseid'>">
        <div class="col-xs-4 col-md-2">
          <img src="img/client4.jpg" class="profile_picture img-rounded">
          <?php echo '<h6 class="discussionname">' . $row2['first_name'] . ' ' . $row2['last_name'] . '</h6>';?>
        </div>
      </a>
      <div class="col-xs-8 col-md-10 discussion_title">
         <?php echo '<h5><a href="discussion.php?caseid='.$thecaseid.'&did='.$discussion_id.'"> '.$row2['discussion_title'].'</a> -'. $row2['message_text'];?></h5>           
        <h6 class="pull-right">Dec. 25</h6>
      </div>
    </div>
    <?php
    };

2 个答案:

答案 0 :(得分:0)

一个建议,使用表别名。总代码量将更小且更易于理解。使用limit子句返回1行。

$discussionquery = "
 SELECT 
   m.discussion_id, 
   u.first_name, 
   u.last_name, 
   d.message_text, 
   c.discussion_title                         
 FROM `user_profile` as u                       
 INNER JOIN discussion_messages as m
   ON (u.user_id = m.user_id) 
 INNER JOIN case_discussion c
   ON (m.discussion_id = c.discussion_id) 
 WHERE 
   m.case_id = '$thecaseid' 
 ORDER BY 
   m.message_id DESC
 LIMIT 1";

答案 1 :(得分:0)

您需要逻辑来查找每个讨论的最后一条消息。写这种情况的方法不止一种。

以下使用not exists子句。这将检查没有具有较大ID的消息供讨论使用:

SELECT dm.discussion_id, up.first_name, up.last_name, dm.message_text, cd.discussion_title 
FROM `user_profile` up INNER JOIN
     discussion_messages dm
     ON (user_profile.user_id = dm.user_id) INNER JOIN
     case_discussion cd
     ON (cd.discussion_id = dm.discussion_id) 
WHERE dm.case_id = '$thecaseid' and
      not exists (select 1
                  from discussion_messages dm2
                  where dm2.discussion_id = dm.discussion_id and
                        dm2.message_id > dm.message_id
                )
ORDER BY dm.message_id DESC;