尝试在某个日期后从多个 mysql 表中进行选择
Posted
技术标签:
【中文标题】尝试在某个日期后从多个 mysql 表中进行选择【英文标题】:Trying to select from multiple mysql tables after a certain date 【发布时间】:2014-09-09 07:27:35 【问题描述】:好的,现在对于我正在从事的社交网络项目,我想实现一个功能,显示自用户上次登录以来网站上发生的所有活动。
我有两张表,一张用于posts,一张用于replies 的帖子。
帖子:
+----------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(256) | YES | | NULL | |
| comment | varchar(10000) | YES | | NULL | |
| date | datetime | YES | | NULL | |
| likes | int(11) | YES | | 0 | |
| deleted | int(4) | YES | | 0 | |
+----------+----------------+------+-----+---------+----------------+
回复:
+----------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| post | int(11) | NO | | NULL | |
| username | varchar(256) | YES | | NULL | |
| reply | varchar(10000) | YES | | NULL | |
| date | datetime | YES | | NULL | |
| deleted | int(4) | YES | | 0 | |
+----------+----------------+------+-----+---------+----------------+
(Replies 表中的 post 将其链接到它正在回复的帖子的 id — 如有任何混淆,请见谅)
日期是在他们提交帖子或回复后立即设置的。
我要做的是获取用户不在网站上时发布的所有帖子和回复,以显示他们不在时网站的活动。
试图生成类似的东西
Username1 发布在主板上 用户名 2 评论了用户名 1 的帖子
类似的东西。帖子和回复按日期分散。
所以我打算从这些表中查询:
SELECT * FROM replies
WHERE date > arbitrary_date AND deleted=0
UNION ALL
SELECT * FROM posts
WHERE date > arbitrary_date AND deleted=0
ORDER BY date DESC;
我只是想得到一个按日期排序的所有回复和帖子的结果,以便我可以按创建时间的顺序显示它们,最新的在上面。但由于某种原因,我无法弄清楚如何获得正确的结果。要么数据在查询中被打乱,要么就是完全错误。
查询是我真正需要帮助的部分。我对 SQL 不太擅长,尽管进行了广泛的谷歌搜索,但我似乎无法弄清楚这一点。
如果您需要澄清,请告诉我。我很乐意提供更多细节。
【问题讨论】:
【参考方案1】:只要让它们返回相同的列,例如:
SELECT CONCAT(username, ' posted on ', board_name_column) as msg FROM posts ...
UNION
SELECT CONCAT(username, ' commented on ', board_name_column) as msg FROM replies JOIN posts ON replies.post = post.id ...
另一种选择:
SELECT 'post' AS type, username, board_name_column FROM posts ...
UNION
SELECT 'reply' AS type, username, board_name_column FROM replies JOIN posts ON replies.post = post.id ...
【讨论】:
SELECT CONCAT(posts.username, 'posted on Main Board!') as msg, date FROM posts WHERE date > '2014-09-06' AND deleted=0 UNION SELECT CONCAT(replies.username , ' 评论了 ', (SELECT username FROM posts WHERE id=replies.post)) as msg, date FROM replies WHERE date > '2014-09-06' AND deleted=0 ORDER BY date DESC;这最终奏效了。 :) 非常感谢! 您应该使用联接而不是子选择。以上是关于尝试在某个日期后从多个 mysql 表中进行选择的主要内容,如果未能解决你的问题,请参考以下文章
将表中的日期与 TableAU 中的多个日期范围进行比较:构建 WHERE 语句