2012-05-03 29 views
1

我试图在where子句中执行选择。我可以在mysql中的WHERE中执行SELECT吗?

基本上,我有一些用户,并试图查看哪些是活动的。活动意味着他们在过去30天内记录了活动。但是,如果我通过活动表加入用户表,则会得到重复的用户标识(因为每个用户可能已记录多个操作)。

所以我在考虑把选择放在哪里,以检查每个用户是否至少有一个动作。

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

所以这里的问题是什么是你面对 – Satya

+0

不应[鲜明](HTTP问题:// dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html)诀窍? –

回答

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

会在相关的子查询中添加“LIMIT 1”使它更好吗? – Ami

+0

@Ami:是的,很好抓 – zerkms

+0

@zerkms为什么你要大写'SELECT','LIMIT'和'FROM'而不是'WHERE','AND'和'BETWEEN'?奇怪... – Flukey

0

是的,你可以窝内的一个选择where子句,像这样:

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

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

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' 
+0

中的原始查询“DISTINCT”不能应用于整个表格,但“DISTINCT u。*”将起作用。 PS:只要OP只想要有活动的用户 - 'INNER JOIN'就是你想写的 – zerkms

+0

当前查询产生'ERROR 1054(42S22):'字段列表'中的未知列'u' – zerkms

+0

@zerkms ,谢谢,我抓到了INNER JOIN。奇怪的是,我们有一个与u的表别名u相同的列'u',但MySQL没有抱怨。第一个'u'是列。 – Ami

相关问题