You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress MySQL数据库:如何查询数周未发帖用户(禁用MAX(date)在SELECT子句)

查询WordPress中数周未发帖的用户(无需临时表优化方案)

问题背景

需要在WordPress的MySQL数据库中查询数周未发帖的用户,限制条件为不能在SELECT子句中使用MAX(date)函数。

当前尝试的SQL无法返回结果:

select wp_users.user_nicename, wp_users.user_email, max(yearweek(wp_wpforo_posts.created)) as w
from LeBearCNC.wp_users, wp_wpforo_posts
where wp_users.ID = wp_wpforo_posts.userid
and not exists (select max(yearweek(wp_wpforo_posts.created)) where wp_users.ID = wp_wpforo_posts.userid) /*and yearweek(current_date()) - 12 < yearweek(wp_wpforo_posts.created))*/
group by wp_users.user_nicename, wp_users.user_email
order by w desc;

若将MAX(yearweek(wp_wpforo_posts.created))放入WHERE子句,会触发invalid use of group function错误。

注:wp_wpforo_*表属于wpForo论坛插件。

已通过临时表实现需求,但希望优化为无需临时表的方案:

create temporary table if not exists lastpost as 
(select wp_wpforo_posts.userid,max(date(wp_wpforo_posts.created)) as w
from wp_wpforo_posts
group by userid);

SELECT wp_users.display_name, wp_users.user_email, lastpost.w
from wp_users, lastpost
where lastpost.userid = wp_users.ID
and date_add(lastpost.w, interval 6 month) < date(current_date())
order by w desc;

无临时表优化方案

方案1:使用关联子查询

通过子查询预先筛选每个用户的最后发帖记录,再与用户表关联筛选:

SELECT 
    wp_users.display_name, 
    wp_users.user_email,
    sub.w AS last_post_date
FROM wp_users
INNER JOIN (
    SELECT 
        userid,
        date(created) AS w
    FROM wp_wpforo_posts p
    WHERE NOT EXISTS (
        SELECT 1 
        FROM wp_wpforo_posts p2 
        WHERE p2.userid = p.userid 
        AND p2.created > p.created
    )
) AS sub ON wp_users.ID = sub.userid
WHERE DATE_ADD(sub.w, INTERVAL 12 WEEK) < CURRENT_DATE() -- 替换为你需要的"数周",示例为12周
ORDER BY sub.w DESC;

逻辑说明:子查询通过NOT EXISTS排除掉用户所有非最新的帖子,直接获取每个用户的最后发帖日期;后续关联用户表,筛选出超过指定周数未发帖的用户。

方案2:使用窗口函数(MySQL 8.0+支持)

利用ROW_NUMBER()窗口函数给每个用户的帖子按时间倒序编号,取编号为1的最新帖子:

SELECT 
    u.display_name, 
    u.user_email,
    p.last_post_date
FROM wp_users u
INNER JOIN (
    SELECT 
        userid,
        date(created) AS last_post_date,
        ROW_NUMBER() OVER (PARTITION BY userid ORDER BY created DESC) AS rn
    FROM wp_wpforo_posts
) p ON u.ID = p.userid AND p.rn = 1
WHERE DATE_ADD(p.last_post_date, INTERVAL 12 WEEK) < CURRENT_DATE()
ORDER BY p.last_post_date DESC;

逻辑说明:窗口函数按用户分组,帖子创建时间倒序排序,每组第一条即为用户最后发帖记录;后续筛选逻辑同方案1。


内容的提问来源于stack exchange,提问作者Bernard Grosperrin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:23:17