MySQL Wordpress 数据库:由于我无法在 select 子句中使用 max(date),因此如何查找几周后未发帖的用户?

问题描述 投票:0回答:3

这是我现在的状态,但它没有返回任何东西

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 子句中,我会收到错误消息“无效使用组函数”

忘记准确地说 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;

谢谢你的帮助, 伯纳德

sql mysql wordpress subquery inner-join
3个回答
0
投票

您可以使用子查询作为临时表,注意我的查询使用标准的 sql JOIN,因为这是现在的标准

SELECT wp_users.display_name, wp_users.user_email, lastpost.w
from wp_users JOIN (select wp_wpforo_posts.userid,max(date(wp_wpforo_posts.created)) as w
from wp_wpforo_posts
group by userid) lastpost
ON lastpost.userid = wp_users.ID
WHERE date_add(lastpost.w, interval 6 month) < current_date()
order by w desc;

0
投票

你可以尝试使用这个查询

SELECT u.user_nicename,
       u.user_email,
       MAX(YEARWEEK(p.created)) AS w
FROM   lebearcnc.wp_users u 
         INNER JOIN wp_wpforo_posts p ON u.id = p.userid
WHERE  NOT EXISTS (SELECT 1
                   FROM   wp_wpforo_posts p1
                   WHERE  p1.userid = u.id
                          AND YEARWEEK(p1.created) > YEARWEEK(current_date()) - 12)
GROUP  BY u.user_nicename, u.user_email
ORDER  BY w DESC; 

0
投票

我认为使用子查询检索最新帖子的日期效率更高。可能你的用户很少,帖子很多,所以你宁愿使用相关性来检索你想要的信息,而不是

group by
在大型数据集上,然后
join
.

如果您运行的是最新版本的 MySQL,这是使用横向连接的好地方:

select u.user_nicename, u.user_email, p.last_created
from wp_users u 
cross join lateral (
    select max(p.created) last_created from wp_wpforo_posts p where u.id = p.userid
) p
where p.last_created < current_date - interval 6 month
order by p.last_created; 

在早期版本中,我们可以使用内联子查询,再加一层过滤:

select *
from (
    select u.user_nicename, u.user_email, 
        (select max(p.created) from wp_wpforo_posts p where u.id = p.userid) last_created
    from wp_users u 
) u
where last_created < current_date - interval 6 month
order by last_created; 

对于性能,考虑

wp_wpforo_posts(userid, created)
上的索引,或者更好的是
wp_wpforo_posts(userid, created desc)
.

© www.soinside.com 2019 - 2024. All rights reserved.