我有两个表:消息(用户发布的消息),喜欢(用户和消息之间的多对多关系 - 它表示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)
怎么做?
最好创建一个名为"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而不是用户名.如果你想要用户名,那么你还需要加入到用户表中(这个表没有显示在你的问题中,但我假设你有一个).
| 归档时间: |
|
| 查看次数: |
6616 次 |
| 最近记录: |