具有结果限制的SQL
我正在做一个简单的聊天,需要一种方法,只获得10条“消息”公关对话,但不知道如何做到这一点 这是我已经尝试过的。 我的SQL: 现在我得到了用户ID 1234的所有消息。。。但我只想要10条公共对话信息具有结果限制的SQL,sql,chat,Sql,Chat,我正在做一个简单的聊天,需要一种方法,只获得10条“消息”公关对话,但不知道如何做到这一点 这是我已经尝试过的。 我的SQL: 现在我得到了用户ID 1234的所有消息。。。但我只想要10条公共对话信息 希望有意义标准SQL方法是使用窗口/分析函数: SELECT t.* FROM (SELECT c.*, su.name as sender_name, ru.name as receiver_name, row_number() over (partition by
希望有意义标准SQL方法是使用窗口/分析函数:
SELECT t.*
FROM (SELECT c.*, su.name as sender_name, ru.name as receiver_name,
row_number() over (partition by c.conversation order by c.created desc) as seqnum
FROM chat c INNER JOIN
users su
ON su.id = c.sender_user_id INNER JOIN
users ru
ON ru.id = c.receiver_user_id
WHERE sender_user_id = '1234' OR receiver_user_id = '1234'
) t
WHERE seqnum <= 10
ORDER BY created ASC;
您需要一种在标准SQL中工作的技术,还是忘记标记问题了?是的。例如,选择MSSQL的前10个*和MySQL的限制10。让我加入Oracle的乐趣:。。。。。。。如果rownum()没有看到DDL,就有点难以确定地回答,特别是(我怀疑)您有两个名为
id
(chat.id和users.id)的列,我希望可以在MySQL中完成,我的错。非常感谢。。。但我得到了这个错误:语法使用near'(按c.conversation order按c.created desc划分)作为seqnum。。。知道吗?你在用哪个数据库?SQL server 2008不支持此语法。
SELECT t.*
FROM (SELECT c.*, su.name as sender_name, ru.name as receiver_name,
row_number() over (partition by c.conversation order by c.created desc) as seqnum
FROM chat c INNER JOIN
users su
ON su.id = c.sender_user_id INNER JOIN
users ru
ON ru.id = c.receiver_user_id
WHERE sender_user_id = '1234' OR receiver_user_id = '1234'
) t
WHERE seqnum <= 10
ORDER BY created ASC;
SELECT t.*
FROM (SELECT c.*, su.name as sender_name, ru.name as receiver_name,
(@rn := if(@c = c.conversation, @rn + 1,
if(@c := c.conversation, 1, 1)
)
) as seqnum
FROM chat c INNER JOIN
users su
ON su.id = c.sender_user_id INNER JOIN
users ru
ON ru.id = c.receiver_user_id CROSS JOIN
(SELECT @c := 0, @rn := 0) vars
WHERE sender_user_id = '1234' OR receiver_user_id = '1234'
ORDER BY c.conversation, c.created desc
) t
WHERE seqnum <= 10
ORDER BY created ASC;