这是我现在的状态,但它没有返回任何东西
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 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;
你可以尝试使用这个查询
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;
我认为使用子查询检索最新帖子的日期效率更高。可能你的用户很少,帖子很多,所以你宁愿使用相关性来检索你想要的信息,而不是
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)
.