1

我正在尝试在 where 子句中执行选择。

基本上,我有很多用户,并试图查看哪些是活跃的。活跃意味着他们在过去 30 天内记录了活动。但是,如果我将用户表与活动表连接起来,那么我会得到重复的用户 ID(因为每个用户可能已经记录了多个操作)。

因此,我正在考虑在其中检查每个用户是否有至少一个操作的地方。

SELECT u FROM `users` u
where (
select count(*) FROM `user_activity` ua
where ua.user_id = u.user_id and ua.last_login between "2012-04-01 00:00:00" and "2012-04-30 23:59:59"
) >= 1
4

3 回答 3

1
SELECT u
FROM users u
where EXISTS ( select null
               FROM user_activity ua
               where ua.user_id = u.user_id
                 and ua.last_login between "2012-04-01 00:00:00" and "2012-04-30 23:59:59" 
               LIMIT 1)

感谢@AmiLIMIT 1在子查询中指出可能会稍微提高性能

于 2012-05-03T22:18:21.067 回答
0

是的,您可以在 where 子句中嵌套一个选择,如下所示:

SELECT * FROM mytable WHERE users in(SELECT users FROM  user_activity);

但我不认为你可以在 where 子句中嵌套一个像 count(*) 这样的聚合函数。所以我会先尝试这个,然后是聚合函数,但尝试在没有聚合的情况下编写你的选择。我面前没有你的数据,所以我无能为力。

于 2012-05-03T22:23:27.803 回答
0

是的,您可以将 SELECT 放在 WHERE 子句中。

我会避免使用 JOIN 进行相关子查询,以查看它是否提高了性能:

SELECT DISTINCT `user`
FROM users u
JOIN user_activity ua
  ON ua.user_id = u.user_id
  AND ua.last_login BETWEEN '2012-04-01 00:00:00' AND '2012-04-30 23:59:59'
于 2012-05-03T23:29:18.163 回答