2010-01-13 122 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