我正在尝试在where子句中执行select。
基本上,我有很多用户,并试图查看哪些是活跃的。活动意味着他们在过去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
答案 0 :(得分: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)
感谢@Ami在子查询中指出有关LIMIT 1
的信息,可能会提高性能
答案 1 :(得分:0)
是的,你可以在一个where子句中嵌入一个select,如下所示:
SELECT * FROM mytable WHERE users in(SELECT users FROM user_activity);
但我认为你不能在where子句中嵌入像count(*)这样的聚合函数。所以我先尝试这个然后是聚合函数,但是尝试编写没有聚合的select。我面前没有你的数据,所以我无法帮助你。
答案 2 :(得分: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'