2017-05-09 46 views
0

我有两个表(消息和用户)。我想从消息表中为特定的ad_id选择最后一个(msg_id,text),并且需要从用户表中选择用户的名称。如何从消息表中选择最后一个文本

SELECT u.id 
    , m.date 
    , m.ad_id 
    , max(m.msg_id)as msg_id 
    , u.first_name 
    , m.text 
    , m.u_to_id 
    , m.u_from_id 
FROM user u 
JOIN messages m 
    ON CASE WHEN m.u_from_id ='14' THEN u.id = m.u_to_id 
      ELSE u.id = m.u_from_id END 
AND (m.u_from_id='14' OR m.u_to_id='14') 
AND m.ad_id='20' 
GROUP BY CONCAT(m.ad_id,u.id) 
ORDER by m.msg_id DESC 

这个查询工作,但我不能选择T中的最后m.text Table structure

回答

1
SELECT u.id, m.text 
FROM user u 
JOIN messages m ON m.msg_id = (SELECT max(msg_id) FROM messages WHERE u_from_id = u.id) 

我简化您的查询,以显示有关您的问题的逻辑。基本上你想要在msg_id上加入你的消息表,它等于与该用户的最大msg_id的内部查询。

+0

抱歉地说..查询结果不是预期的一个。我给出了“ON CASE WHEN m.u_from_id = '14'那么u.id = m.u_to_id ELSE u.id = m.u_from_id END”,因为id = '14'的人正在阅读消息,所以不是选择他的名字选择其他人员姓名 – Sujith

+0

GROUP BY CONCAT(m.ad_id,u.id)是因为避免在特定的ad_id上存在多个用户的消息。抱歉的混乱。 – Sujith

0

这么多年的实验增加了一个新的列(讨价还价),用于识别收件人和此查询的工作对我罚款

select m.msg_id,m.text,m.status,m.date,m.bargainer,m.ad_id,u.first_name,u.id from user u JOIN messages m where msg_id in (select max(msg_id) from messages m where m.ad_id=20 and u.id=m.bargainer group by(m.bargainer))group by(m.msg_id) order by msg_id DESC 
相关问题