MySQL数据库:查询表并与其他表的“有效自”日期列连接

时间:2014-04-02 12:14:31

标签: mysql date select join

我无法为我的问题提出有效的SQL查询,我将在博客的场景中对此进行描述。我有三个表:User,Blog - 用于博客条目,UserStatus用于保存用户'他被分配的状态。

表格如下:

User
ID | Name

Blog
ID | User_ID | Date | Text

UserStatus
ID | User_ID | Valid_From_Date | Status

我想你可以想象用户和博客的条目会是什么样子。以下是UserStatus如何寻找一个用户:

ID | User_ID | Valid_From_Date | Status
34 |  7      |  2012-01-01     | Basic
35 |  7      |  2013-04-01     | Premium
36 |  7      |  2014-08-01     | Gold

用户在特定日期的有效状态是最新的满足Valid_From_Date< = Date的状态。所以在2014-03-30'该用户的有效状态为“高级'。

现在,我想要的是将所有博客条目与用户'姓名和有效身份。

我有这种方法:

SELECT User.Name, UserStatus.Status, Blog.Date, Blog.Text
FROM Blog
JOIN User ON User.ID = Blog.User_ID
JOIN UserStatus ON User.ID = UserStatus.User_ID
JOIN (Select User_ID, max(Valid_From_Date) AS date_for_most_recent_status FROM UserStatus
     WHERE date_for_most_recent_status <= ??? GROUP BY User_ID) AS recent_user_status
ON recent_user_status.User_ID = UserStatus.User_ID
AND date_for_most_recent_status = UserStatus.Valid_From_Date

??? - &GT;我可以在加入时与当前条目的特定Blog.Date相关吗?

那种方法:

SELECT User.Name, UserStatus.Status, Blog.Date, Blog.Text, max(Valid_From)
FROM Blog
JOIN User ON User.ID = Blog.User_ID
JOIN UserStatus ON User.ID = UserStatus.User_ID
WHERE UserStatus.Valid_From_Date <= Blog.Date 
GROUP BY Blog.Date, User.Name, Blog.Text

这里的好处是我可以与实际的Blog.Date相关,因为它只是在Select-Statement上。但是,我不知道如何处理UserStatus.Status,它应该在GROUP BY表达式中但不能,因为我只想要最新的。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

相关子查询获取表中列的值并将其映射到子表中的值。在这种情况下,我们知道每个用户都需要max valid_from_Date,因此我们使用子查询外部的表中的userID和子查询内表上的userID,并返回最大值并使用该值作为标准来确定哪个用户状态记录限制加入。

SELECT User.Name, UserStatus.Status, Blog.Date, Blog.Text
FROM Blog
JOIN User 
  ON User.ID = Blog.User_ID
JOIN UserStatus 
  ON User.ID = UserStatus.User_ID
  and Valid_from_date = (Select max(Valid_From_Date)
      FROM UserStatus
      where user_ID = User.ID
      and UserStatus.Valid_from_Date <= Blog.Date)

答案 1 :(得分:1)

如果您希望数据用户明智,请使用以下内容:

SELECT User.Name, a.Status, Blog.Date, Blog.Text, a.valid_from_date
FROM Blog
JOIN USER ON User.ID = Blog.User_ID
JOIN
(SELECT user_id,`status`,valid_from_date FROM userstatus ORDER BY valid_from_date DESC) a
ON a.user_id=User.ID
WHERE a.Valid_From_Date <= Blog.Date 
GROUP BY a.user_id;

如果您想要博客日期,用户,文本明智,请使用:

SELECT User.Name, a.Status, Blog.Date, Blog.Text, a.valid_from_date
FROM Blog
JOIN USER ON User.ID = Blog.User_ID
JOIN
(SELECT user_id,`status`,valid_from_date FROM userstatus ORDER BY valid_from_date DESC) a
ON a.user_id=User.ID
WHERE a.Valid_From_Date <= Blog.Date 
GROUP BY Blog.Date, a.user_id, Blog.Text;