使用联合表时如何选择不同的行

时间:2018-11-23 20:16:35

标签: mysql

我有两个表,分别名为chatMaster和chatMessages,我试图离开这两个表,以获取每次聊天的主消息和最新消息的所有数据。我正在使用此查询来连接两个表

SELECT  c.id, c.p1, c.p2, m.toP, m.message, m.createdOn FROM chatMaster c
left join chatMessages m on c.id = m.id group by  m.id ;

此查询仅用于为chatMaster中的每个条目选择一行,但它为每个条目(例如,

)选择第一条消息
1, 2018-11-24 00:40:08, HI!,       99e22056-ee7f-11e8-bc28-8acac6f59ef9, 1001
2, 2018-11-24 00:40:21, HI! There, 99e22056-ee7f-11e8-bc28-8acac6f59ef9, 1
3, 2018-11-24 01:33:12, HI!,       e3345a17-ee7f-11e8-bc28-8acac6f59ef9, 2

这是select * from chatMessages的结果,有两个聊天ID为99e22056-ee7f-11e8-bc28-8acac6f59ef9的条目,我希望发送一个在2018-11-24 00:40:21上发送的条目,但是我的加入查询的结果是< / p>

99e22056-ee7f-11e8-bc28-8acac6f59ef9, 1001,     1,    1001, HI!, 2018-11-24 00:40:08
e3345a17-ee7f-11e8-bc28-8acac6f59ef9,    2, 10001,       2, HI!, 2018-11-24 01:33:12

它正在选择第一条消息。如何选择最新消息?我应该进行哪些更改才能从chatMessages而不是第一条消息中获取最新消息。请询问您是否需要更多详细信息

1 个答案:

答案 0 :(得分:2)

Derived Table中,您可以为每个聊天主机createdOn获得createdOn(最新的id)的最大值。然后,您可以将此结果集加入主表,以仅获取对应于最新createdOn的行。

SELECT  c.id, c.p1, c.p2, m.toP, m.message, m.createdOn 
FROM chatMaster c 
LEFT JOIN
( SELECT id, MAX(createdOn) AS latest_createdOn 
  FROM chatMessages 
  GROUP BY id
) AS dt 
  ON dt.id = c.id 
LEFT JOIN chatMessages m 
  ON m.id = c.id AND 
     m.createdOn = dt.latest_createdOn