id job_id sender_buyer rcpt_driver sender_driver rcpt_buyer action text
100 10 0 0 34 55 message fhudos
101 10 0 0 34 55 message jgfjgf
102 10 55 34 0 0 post_job
103 17 0 0 34 55 message gyujkf
104 17 55 34 0 0 message tgfdfd
我有一个记录用户之间所有操作的表。用户有两种类型:买家和司机。买家只与司机互动,反之亦然。
&#39>行动' table记录了动作的类型,以及发送者ID和rcpt id。行动的示例包括' message',' post_job'' post_review'例如,买方可能会发布一份工作,因此一个动作就会出现在'动作中。表说谁是发件人,谁是行动的rcpt。以下是表格中的数据样本。
我想做一个买家会执行的查询,查询将获得他的行动"但不是全部。只是"动作"的一个子集应用内的Feed屏幕。
我想选择如下:
您希望看到的主要目的是'崩溃'如果它们连续属于同一作业并且来自同一驱动程序,则会显示在Feed中的消息。因此,如果驱动程序一个接一个地向买方发送3个消息,而在其间没有发生其他动作(按时间顺序排列),则这3个消息被折叠,即仅显示最近的消息。然后是下一个操作,依此类推,并且每次发生一系列来自相同作业的同一驱动程序的消息操作时,都会消除不需要的消息。
所以在上表中我们会得到结果:
100 <-- ELIMINATED - because job_id and sender_driver are same as the next action, which is more recent, so we hide this one
101 <-- SELECTED - a message from a driver
102 <-- SELECTED - Buyer posted a job
103 <-- SELECTED - a message from a driver
104 <-- ELIMINATED - messages the buyer sent are not shown.
我不想开始查询然后在某个循环中过滤它们,因为那时我将不得不做多个查询以获得一定数量的结果回到客户端应用程序。如果可能的话,我需要1个查询中的所有内容,这样我只需将页码传递给我的脚本就可以使用LIMIT和OFFSET进行分页。
是否可以在1个查询中执行此操作?
**更新* 我想我需要进行连接,在那里我加入匹配相同job_id和sender_driver的下一行,并且id大于当前id。然后我可以省略outser WHERE子句中的行,以便过滤掉连续的消息。这是我的查询,尚未完成:
SELECT *
FROM action as a1
INNER
JOIN
( SELECT *
FROM action
ORDER
BY id DESC
LIMIT 1
) AS a2
ON a2.job_id = a1.job_id
AND a2.sender_driver = a1.sender_driver
AND a2.id > a1.id
WHERE (a1.sender_buyer = 52 AND a1.the_action <> 'message')
OR (a1.rcpt_buyer = 52 AND a2.the_action <> 'message');
查询运行但不返回任何结果。