按日期排序(时间戳)2个单独的表,其中包含2个表

时间:2018-04-27 12:41:49

标签: mysql sql

我总共有4个表:posts_messages,private_messages,users,posts。 我想显示posts_messages或private_messages的所有最后消息的列表,按其中任何一个发送的最后一条消息排序。

其他2个表(用户和帖子)包含我想要显示的数据以及最后一条消息:" users"包含发件人的姓名,并且与private_messages'一起显示。最后的消息。 posts表包含帖子标题,并且要显示在posts_messages'最后的消息。

sender_id上的private_messagesposter_id上的posts_messagesuser_id上的users之一

示例输出:

John Doe: See you  (15:05)
Post Title #1: Great idea (14:55)
Post Title #4: Looking good (13:20)
Albert Stein: later Yes, sure..(12:00)

所以我需要从posts_message中获取private_messages和第10行和第11行中的第24行和第25行,并按日期排序

(**重要的不是连接本身(我以后可以添加它,所以我可以选择所有字段) - 重要的部分是只获取单行消息而不重复,如下所示:有多条消息,但您只能从每条不同的消息中获取最后一条消息)

表格如下:

private_messages:

-------------------------------------------------------------------------------
| message_id | sender_id |  receiver_id  | message_text |   date              |
-------------------------------------------------------------------------------
|   22       |      20   |      44       |   Ok got it  |2018-04-27 10:03:47  |
-------------------------------------------------------------------------------
|   23       |      13   |      44       |   Very well  |2018-04-27 11:49:33  |
-------------------------------------------------------------------------------
|   24       |      20   |      44       |  Yes, sure.. |2018-04-27 12:00:15  |
-------------------------------------------------------------------------------
|   25       |      13   |      44       | See you later|2018-04-27 15:05:30  |
-------------------------------------------------------------------------------

用户:

--------------------------------------------------
| user_id |     first_name    |    last_name     |
--------------------------------------------------
|   13    |     John          |    Doe           |
--------------------------------------------------
|   20    |     Albert        |    Stein         |
--------------------------------------------------

posts_messages:

---------------------------------------------------------------------------
| message_id | post_id  | poster_id | message_text |       date           |
---------------------------------------------------------------------------
|    8       |    1     |   98      | Hello world  |  2018-04-27 12:02:22 |
---------------------------------------------------------------------------
|    9       |    4     |   123     |    Hi all    |  2018-04-27 13:11:11 |
---------------------------------------------------------------------------
|    10      |    4     |   77      | Looking good |  2018-04-27 13:20:17 |
---------------------------------------------------------------------------
|    11      |    1     |   101     | Great idea   | 2018-04-27 14:45:15  |
---------------------------------------------------------------------------

帖子:

---------------------------------------------------
| post_id | post_creator_id  |    post_title      |
---------------------------------------------------
|    1    |       22         |    Post Title #1   |
---------------------------------------------------
|    4    |       35         |    Post Title #4   |
---------------------------------------------------

希望这是可以理解的帖子, 有点复杂,希望可以做到 谢谢!

3 个答案:

答案 0 :(得分:0)

这是邮政表的一个例子。这应该显示每个帖子的最新消息。我想这就是你想要的。

select  post_messages.*
from    post_messages,
        (
            select    max(message_id),
                      post_id
            from      post_messages
            group by  post_id  -- the greater the message id, the newer the message.  You can use date to too if you want, will run slower.
         ) as post_latest_view
where   post_messages.message_id = post_latest_view.message_id;    

答案 1 :(得分:0)

使用UNION ALL合并private_messagesposts_messages然后ORDER BY DATE

  • CONCAT功能可以将您的消息与message_title结合起来
  • date_format(DATE,'(%H:%i)')获取hh:mm dateformat

你可以试试这个。

  SELECT content FROM (
    SELECT CONCAT(u.first_name,' ',u.last_name,':',pm.message_text,' (',date_format(DATE,'%H:%i'),')') content,DATE 
    FROM private_messages pm
    INNER JOIN users u on u.user_id = pm.sender_id
    UNION ALL
    SELECT CONCAT(p.post_title,':',pm.message_text,' (',date_format(DATE,'%H:%i'),')'),DATE 
    FROM posts_messages pm
    INNER JOIN posts p on p.post_id=pm.post_id

)t
ORDER BY DATE DESC

sqlfiddle:https://www.db-fiddle.com/f/nL5apRJ8pWVqDQuFzH5pp7/1

SELECT CONCAT(message_title,':',message_Content) content
FROM (
    SELECT CONCAT(u.first_name,' ',u.last_name) message_title,CONCAT(pm.message_text,date_format(DATE,'(%H:%i)')) as 'message_Content',DATE 
    FROM private_messages pm
    INNER JOIN users u on u.user_id = pm.sender_id
    UNION ALL
    SELECT  p.post_title,CONCAT(pm.message_text,date_format(DATE,'(%H:%i)')) message_content,DATE 
    FROM posts_messages pm
    INNER JOIN posts p on p.post_id=pm.post_id
)t
ORDER BY DATE DESC

sqlfiddle:http://sqlfiddle.com/#!9/b255c5/8

<强>结果

enter image description here

答案 2 :(得分:0)

试试这个(可能需要一个小的调试,因为我没有安装mySQL):

select line from(
    ( select CONCAT(u.first_name, ' ', u.last_name, ': ', p.message_text, ' (', 
    DATE_FORMAT(p.date, '%H:%i'), ')') as line, p.date as date from users u, 
    private_messages p where u.user_id = p.sender_id ) 

    UNION

    ( select CONCAT(po.post_title, ': ', m.message_text, ' (', 
    DATE_FORMAT(m.date, '%H:%i'), ')') as line, m.date as date from 
    posts_messages m, posts po where po.post_id = m.post_id )

    order by date DESC
)
相关问题