SQL - 从两个表中按列排序

Pet*_*trB 2 mysql sql

我有两个表:消息(用户发布的消息),喜欢(用户和消息之间的多对多关系 - 它表示user1喜欢message5).

messages
---------
id, id_user, message, created_at

likes
-----
id_user, id_message, created_at
Run Code Online (Sandbox Code Playgroud)

如果我发送消息,它将转到消息表.如果我喜欢某人的消息,将在likes表中创建一条新记录(is_user = me,id_message =我喜欢的消息).

问题是,我想在"created_at"排序的一个列表中显示我的行为的历史=消息和喜欢.

就像是:

- 1/1/2010 i sent message "aaa"
- 2/1/2010 i sent message "bbb"
- 3/1/2010 i liked somebodys's message "ccc"
- 4/1/2010 i send message "ddd"
Run Code Online (Sandbox Code Playgroud)

编辑此外 ,我还要显示我喜欢的状态的详细信息:

- 3/1/2010 i liked somebodys's message **"ccc"**
Run Code Online (Sandbox Code Playgroud)

怎么做?

Mar*_*ers 6

最好创建一个名为"actions"的新表,其中在此表中重新添加消息或喜欢消息,然后通过查询此表来获得所需的内容很简单.

如果你不能这样做那么你通过UNIONing每个表中的数据并查询结果表来使用你现有的模式,但它不会像索引一样有效,created_at不能使用:

SELECT * FROM
(
    SELECT 1 AS type, id, id_user, message, created_at FROM messages
    UNION ALL
    SELECT 2 AS type, NULL, id_user, id_message, created_at FROM likes
) T1
ORDER BY created_at
Run Code Online (Sandbox Code Playgroud)

添加联接以获取有关您喜欢的邮件的相关信息,例如邮件发件人的用户名和邮件文本.将此信息转换为字符串的任务通常最好在应用程序级别完成,以减少数据库服务器与应用程序之间不必要的数据传输.

如果你真的想在数据库中这样做,那么你可以使用CONCAT来构建字符串:

SELECT messagetext
FROM
(
    SELECT
        created_at,
        CONCAT('I sent message "', message, '"') AS messagetext
    FROM messages
    WHERE id_user = 1
    UNION ALL
    SELECT
        likes.created_at,
        CONCAT('I liked ', messages.id_user ,'\'s message "', messages.message, '"')
    FROM likes
    JOIN messages
    ON likes.id_message = messages.id
    WHERE likes.id_user = 1
) T1
ORDER BY created_at
Run Code Online (Sandbox Code Playgroud)

结果:

I sent message "aaa"
I sent message "bbb"
I liked 2's message "ccc"
I sent message "ddd"

请注意,将显示user_id而不是用户名.如果你想要用户名,那么你还需要加入到用户表中(这个表没有显示在你的问题中,但我假设你有一个).