2011-08-01 149 views
9

这是一个由Ryan Frank在forums.mysql.com上提出的问题,我也正在面对这个问题。COUNT(DISTINCT)子句中的WHERE子句

我已经在我的SELECT语句的开头如下:

SELECT accounts.id, accounts.company, accounts.first, accounts.last, 
COUNT(DISTINCT accounts_log.login_time) AS visits, 
COUNT(DISTINCT accounts_log.ip_address) AS visitors, 
COUNT(DISTINCT documents_log.access_time) AS docs, 
MAX(accounts_log.login_time) AS login_time 
FROM accounts 

这将返回我需要的所有变量;不过,我想将使用COUNT(DISTINCT)的变量限制在日期范围内。我无法在FROM子句之后使用WHERE子句。例如:

FROM accounts 
WHERE accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' 

将无法​​正常工作,因为它不会给我像我需要的所有帐户。

我在寻找类似:

COUNT(DISTINCT accounts_log.login_time WHERE accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to') AS visits 

附:我知道上述不起作用,并已用完语法选项。

+0

您没有向我们展示整个查询。 'accounts_log'表来自哪里? –

+0

假设你可以用帐户 – eyaler

回答

8
SELECT accounts.id, accounts.company, accounts.first, accounts.last, 
COUNT(DISTINCT case when accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' then accounts_log.login_time else null end) AS visits, 
COUNT(DISTINCT case when accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' then accounts_log.ip_address else null end) AS visitors, 
COUNT(DISTINCT case when accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' then documents_log.access_time else null end) AS docs, 
MAX(accounts_log.login_time) AS login_time 
FROM accounts 
+0

很大更换accounts_log,现在说我需要多个不同的数,即:计数(不同accounts_log.ip_address1,accounts_log.ip_address2)时间条件下。我试过了: COUNT(DISTINCT case when accounts_log.login_time> ='$ search_from'AND accounts_log.login_time <='$ search_to'then(accounts_log.ip_address1,accounts_log.ip_address2)else null end)AS访问者 但这不起作用 – eyaler

+0

落得这样做: COUNT(DISTINCT(情况下,当accounts_log.login_time> = '$ search_from' AND accounts_log.login_time <= '$ search_to' 然后accounts_log.ip_address1否则返回null结束),(情况下,当accounts_log.login_time> ='$ search_from'AND accounts_log.login_time <='$ search_to'then accounts_log.ip_address2 else null end))AS访问者 – eyaler

0

你可以把条件的LEFT JOINON条款:

SELECT a.id, a.company, a.first, a.last, 
COUNT(DISTINCT al.login_time) AS visits 
FROM accounts a 
LEFT JOIN accounts_log al ON (al.account_id = a.id AND 
al.login_time BETWEEN '$search_from' AND '$search_to') 

和同其他表。