2010-01-13 176 views
1

我想只选择第一个select语句和最后一个select语句中的User_IDs,但我做错了什么。如何在SQL中嵌套select语句?

SELECT COUNT(DISTINCT User_ID) AS total 
FROM UserClicks 
WHERE (Date > :startDate AND Date < :endDate) 
AND User_ID IN (
    SELECT User_ID 
    FROM UserClicks 
    WHERE (Date > :monthBeforeStartDate AND Date < :startDate) 
) 

更新:这是一个MySQL数据库。

+0

您使用的是什么RDBMS? SQL语法因系统而异。 – Dathan 2010-01-13 17:40:36

+0

请你可以发表表格结构。 – Josh 2010-01-13 17:40:40

回答

2

子查询和参加将在这里适合你

SELECT DISTINCT u1.UserID 
FROM 
    UserClicks u1 
INNER JOIN 
(
    SELECT 
     UserID 
    FROM 
    UserClicks 
    WHERE 
    (Date > :monthBeforeStartDate AND Date < :startDate) 
) u2 
ON u1.UserID = u2.UserID 
WHERE 
    (u1.Date > :startDate AND u1.Date < :endDate) 
+0

难道你不能解释一下这个查询吗?我需要做一个稍微不同的选择 - 我甚至不确定这是否是这样。 – 2014-01-19 19:32:48

0

如果您的查询是挂,这是因为索引,优化外部查询和内部查询,你想要索引像这样:

create index du on UserClicks (Date, User_ID) 
create index ud on UserClicks (User_ID, Date) 

应该然后返回瞬间。关于MySQL如何优化与IN运营商指定的子查询的详细信息:

http://dev.mysql.com/doc/refman/5.1/en/optimizing-subqueries.html

的MySQL替换 以下形式的子查询与索引的查找 功能,EXPLAIN描述为 特殊的连接类型(unique_subquery或 index_subquery):

... IN(SELECT indexed_column FROM SINGLE_TABLE ...)

+0

它看起来像一个查询,以“让用户谁点击之间点击前一个月的开始和结束谁点击”。 所以他们确实可以既 startDate。 – 2010-01-13 17:42:54

+0

嘿,你刚刚删除了我评论的部分答案。 – 2010-01-13 17:44:25

+0

最后加入some_name并没有解决问题。 – Andrew 2010-01-13 17:48:02

0
SELECT COUNT(DISTINCT User_ID) AS total 
    FROM UserClicks 
    WHERE (Date BETWEEN startDate AND endDate) AND User_ID IN ( 
     SELECT User_ID 
     FROM UserClicks 
     WHERE (Date BETWEEN monthBeforeStartDate AND startDate) 
    ) GROUP BY User_ID 
+0

不,对不起,我的日期选择 – Andrew 2010-01-13 17:56:58

+0

没有问题,尽管使用BETWEEN也可以,我已经转而使用它了。 =] – Andrew 2010-01-13 18:06:16

0

我很好奇......你为什么不只是有一个更详细的WHERE语句?

SELECT COUNT(DISTINCT User_ID) AS total
FROM UserClicks
WHERE (Date > :startDate AND Date < :endDate)
AND (Date > :monthBeforeStartDate AND Date < :startDate)

更新:
好像你想要谁的startDate和结束日期谁起始日期之前还点击了一个月之间点击用户数的计数。

根据您的日期是否适合MySQL的格式(如YYYY-MM-DD HH:MM:SS),您可以使用MySQL获取开始日期之前的月份。下面的示例:

SELECT COUNT(DISTINCT User_ID) AS total
FROM UserClicks
WHERE (Date > :startDate AND Date < :endDate)
AND (Date > DATE_SUB(:startDate, INTERVAL 1 MONTH) AND Date < :startDate)

+1

有这两个语句使它不会返回任何内容。我从那个查询中得到零。我认为这是因为他们不可能都是真的 – Andrew 2010-01-13 18:12:08

+0

Doh,傻我。好像你需要一个嵌套选择。或者可能是另一个加入 我在想这是否会达到与嵌套查询相同的结果... 'SELECT COUNT(DISTINCT User_ID)AS FROM UserClicks AS uc1 JOIN UserClicks AS uc2 ON uc2.Date>:monthBeforeStartDate AND uc2.Date < :startDate AND uc1.User_ID = uc2.User_ID WHERE uc1.Date>:startDate AND uc1.Date <:endDate' – ckrailo 2010-01-13 20:48:06

0

我已经很难与MySQL的子查询中,这两个查询使用相同的表。我的解决方案一直使用加入

SELECT COUNT(DISTINCT User_ID) AS total 
FROM UserClick u1 
    JOIN UserClick u2 
     on u2.User_ID = u1.User_ID 
WHERE u1.Date BETWEEN :startDate AND :endDate 
    AND u2.Date BETWEEN :monthBeforeStartDate and :startDate