我有两个表:消息(用户发布的消息),喜欢(用户和消息之间的多对多关系 - 它表示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"**
怎么做?
答案 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