mysql查询选择所有但限制每次出现的参数

时间:2014-04-18 17:29:36

标签: php mysql sql database

我很难写出这个问题。我有一个消息数据库,我想从每个对话中检索最新的2。如何在查询语法中加入限制以将每个唯一用户限制为仅两个?或者我必须选择all然后在fetch assoc中循环?查询看起来像这样:

$to = $_REQUEST['to'];
$lastid = $_REQUEST['lastId'];
$link = mysqli_connect('localhost', 'root', '', 'messagedb');
if ($link) {
    $query = mysqli_query($link, "SELECT * FROM messages WHERE (toName='$to' OR fromName='$to') AND id>'$lastid' order by id desc");
    $messages = array();
    while ($row = mysqli_fetch_assoc($query)) {
        if (!in_array($row['toName'], $messages) || !in_array($row['fromName'], $messages)) {
            $messages[] = $row;
        }
    }
}

当然,这不起作用......它只是让所有东西都恢复了......而且我无法限制已有的行数。我希望有一个简单的查询解决方案。提前谢谢!

数据库看起来像这样:

id  |  fromName   |   toName   |   theMessage
------------------------------------------------------------
 1        me           joe       some message to joe from me
 2        john         me        message from john to me
 3        sarah        me        message from sarah to me
 4        joe          me        answer back to joe from me
 5        me           john      answer back to john from me
 6        me           sarah     answer back to sarah from me
 //and so on...just conversations between people

所以在我的查询中,$ to是我,或者任何用户将使用它。我希望得到我/他们与每个人的对话,但在开始时将其限制在一定数量......所以以后他们可以加载更多。

3 个答案:

答案 0 :(得分:0)

使用此代码:

SELECT * FROM messages WHERE (toName='$to' OR fromName='$to') AND id>'$lastid' order by id desc LIMIT number_of_rows

答案 1 :(得分:0)

首先复制并粘贴此而不是检查..

没有什么只是你在放Varaibles

时出错了
$to = $_REQUEST['to'];
$lastid = $_REQUEST['lastId'];
$link = mysqli_connect('localhost', 'root', '', 'messagedb');
if ($link) {
    $query = mysqli_query($link, "SELECT * FROM `messages` WHERE (toName='".$to."' OR fromName='".$to."') AND id>'".$lastid."' order by id desc");
    $messages = array();
    while ($row = mysqli_fetch_assoc($query)) {
        if (!in_array($row['toName'], $messages) || !in_array($row['fromName'], $messages)) {
            $messages[] = $row;
        }
    }
}

答案 2 :(得分:0)

有很多事情需要注意(比如你不依赖某些日期/时间字段来组织消息)。然后,正如您所说,最好的方法是使用PHP从每个地址组合中获取最后两行。 否则你也可以使用top clause,但我很难想到一种方法可以直接达到你想要的效果。