在我的应用程序中,用户可以登录然后分享内容。我想获取与他们分享内容的日期相关的最新登录信息(例如,比共享日期之前的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
不匹配。
答案 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
子句的外部查询轻松选择所需的行。