SQL - 从两个表中按列排序

时间:2010-10-03 09:57:35

标签: sql mysql

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

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

likes
-----
id_user, id_message, created_at

如果我发送消息,它将转到消息表。如果我喜欢某人的消息,将在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"

修改的 而且,我还希望显示我喜欢的状态的详细信息:

- 3/1/2010 i liked somebodys's message **"ccc"**

怎么做?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

如果确实希望在数据库中执行此操作,那么您可以使用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

结果:

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

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

答案 1 :(得分:0)

SELECT ....
FROM
(
    SELECT MSGS.
       ......
       MSGS.created_at
    FROM MSGS
    WHERE MSG.id_user = me
  UNION
    SELECT LIKES. 
       ..........
       LIKES.created_at
    FROM MSGS, LIKES
    WHERE MSGS.id_message = LIKES.id_message
      AND MSGS.id_user = me
  ) A
ORDER BY  A.created_at