由sql组的问题

时间:2011-01-03 19:39:06

标签: php mysql

这是我的问题,我想制作“twitter like”直接邮件系统(发件人的收件箱组),我的数据库看起来像这样:

CREATE TABLE `messages` 
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sender` int(11) NOT NULL,
  `receiver` int(11) NOT NULL,
  `text` text NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) 

所以我尝试这样的事情:

$requette = mysql_query("SELECT * FROM messages WHERE receiver = '$user_id' 
GROUP BY sender ORDER BY date DESC LIMIT 0,10");

while($data = mysql_fetch_array($requette)) 
{
  echo $data[date].'<br/>'.$data[text].'<hr>';
}

现在讨论按发送者分组,发送最后一个,这很好。

但我的问题是:$data[date]$data[text],它们来自第一个ID,我想从最后一个ID获取它,所以我可以预览文本和最后一条消息的时间。< / p>

感谢您的帮助,对不起我的英语(我是法国人)。

3 个答案:

答案 0 :(得分:2)

我想这会完成这项工作:

$requette = mysql_query("SELECT * FROM messages WHERE id IN
(SELECT MAX(id) FROM messages WHERE receiver = '$user_id' GROUP BY sender)
ORDER BY date DESC LIMIT 0,10");

while($data = mysql_fetch_array($requette)) 
{
    echo $data[date].'<br/>'.$data[text].'<hr>';
}

编辑只是一个简短的解释:内部查询负责根据ID字段获取每个用户的所有最后消息(我正在考虑最后的消息具有最高的ID值,这很可能是真的。)

答案 1 :(得分:0)

好吧,这可能对MYSQL没有帮助,但是对于任何使用T-SQL(MSSQL Server)的人来说,你可以使用ROW_NUMBER()操作(以及分区/顺序)来获取订单和索引,然后使用外部选择以获取具有第一个索引的元素。

示例(使用stack exchange query tester中的语法):

select * from
(
    select
        postTypeId
        , id
        , ROW_NUMBER() over (partition by postTypeid order by id) as orderIndex
    from posts
​) as a
where a.orderIndex = 1​

您可以在MYSQL中使用类似的策略。

答案 2 :(得分:0)

$requette = mysql_query("SELECT * FROM messages WHERE receiver = '$user_id' AND date = (SELECT MAX(messages2.date) FROM messages AS messages2 WHERE messages.sender = messages2.sender LIMIT 1) GROUP BY sender ORDER BY date DESC LIMIT 0,10");

仅选择具有每个发件人的最大日期的记录。