根据附近日期关联两个表

时间:2015-09-28 19:09:37

标签: mysql sql

在我的应用程序中,用户可以登录然后分享内容。我想获取与他们分享内容的日期相关的最新登录信息(例如,比共享日期之前的MAX登录日期)

我有两个表(它们与csh.actor = ul.user_id相关):

CollectionShares(csh)

| id | actor | shareDate

UsersLogins(ul)

| id | user_id | httpReferer | browser | ipAddress | loginDate

我的一次尝试:

SELECT
    csh.shareDate AS shareDate,
    ul.httpReferer AS httpReferer,
    ul.browser AS browser,
    ul.ipAddress AS ipAddress,
    max(ul.loginDate) AS nearestLastLoginDate
FROM collectionsharehistory csh
JOIN userslogins ul ON 
    csh.actor = ul.user_id 
    AND 
    ul.loginDate <= csh.shareDate
GROUP BY csh.id;

这实际上似乎是正确的ul.loginDate,但其他ul列不正确,似乎与返回的loginDate不匹配。

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT ul.id, ul.user_id, ul.ipAddress, ul.loginDate, csh.shareDate                  
FROM UsersLogins AS ul
INNER JOIN CollectionSharesHistory AS csh 
  ON ul.user_id = csh.actor AND ul.loginDate <= shareDate

为了让所有用户登录都有相关的发布日期CollectionSharesHistory记录。

使用变量,您可以从上述查询生成的派生表中选择所需的记录:

SELECT id, user_id, ipAddress, loginDate, shareDate
FROM (
  SELECT id, user_id, ipAddress, loginDate, shareDate,
         @rn := IF (@user <> user_id,
                   IF (@user := user_id, 1, 1),
                   IF (@user := user_id, @rn + 1, @rn + 1)) AS rn
  FROM ( ... above query here ... ) AS t
  CROSS JOIN (SELECT @user := -1, @rn := -1) AS vars
  ORDER BY user_id, loginDate DESC, shareDate ASC ) AS s
WHERE s.rn = 1

@rn变量用于枚举每个user_id分区中的记录。重置user_id更改@rn后,枚举将再次从1开始。

ORDER BY子句将所需记录放在每个user_id切片的顶部。因此,我们可以使用带有WHERE s.rn = 1子句的外部查询轻松选择所需的行。

Demo here