尝试在某个日期后从多个 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 表中进行选择的主要内容,如果未能解决你的问题,请参考以下文章

MySQL选择多个表并选择日期并与今天的日期进行比较

在单个表中使用while循环进行多个选择查询?可能吗?

1 周后从 MySQL 数据库中删除记录

将表中的日期与 TableAU 中的多个日期范围进行比较:构建 WHERE 语句

Power BI中有一列日期有多个是相同的,如何在表中的X轴上全部显示出来

SQL 从多个表中选择 *