这是我的问题,我想制作“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>
感谢您的帮助,对不起我的英语(我是法国人)。
答案 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");
仅选择具有每个发件人的最大日期的记录。