2013-08-20 57 views
4

我有一個自定義的書寫分析系統正在運行,並且我正在嘗試編寫一個查詢,以返回登錄特定頁面的用戶作爲他們的第一次打擊。表的相關部分是設置正因爲如此,有一些簡單的數據:選擇第一個結果爲特定值的行

pageviews Table 
+----+---------------------+----------+-------------+ 
| id |  time_in  | users_id | articles_id | 
+----+---------------------+----------+-------------+ 
| 0 | 2013-08-15 00:00:00 |  0 |   0 | 
| 1 | 2013-08-16 00:00:00 |  0 |   1 | 
| 2 | 2013-08-17 00:00:00 |  1 |   1 | 
| 3 | 2013-08-18 00:00:00 |  1 |   0 | 
| 4 | 2013-08-19 00:00:00 |  1 |   1 | 
| 5 | 2013-08-20 00:00:00 |  2 |   1 | 
+----+---------------------+----------+-------------+ 

注:在我的數據庫ID字段實際使用的GUID,而不是整數在這個簡單的例子。

現在,如果我想看到誰讀文章1作爲他們的第一擊,我希望我的查詢返回用戶12,但不0,爲用戶0看到文章0作爲他們先打在網站上。相反,如果我想查看誰先閱讀文章0,則查詢將僅返回用戶0

這裏是我的查詢迄今:

SELECT 
    * 
FROM 
    pageviews 
WHERE 
    articles_id = 1 
GROUP BY 
    users_id 
ORDER BY 
    time_in 

但這返回誰讀過文章1所有用戶不同的用戶ID,沒有過濾掉誰沒看出來他們的第一個結果的用戶。我覺得自己的方向與我的問題一致,所以我正在轉向你們。

在此先感謝。

回答

2

一種方式做到這一點

SELECT v.users_id 
    FROM pageviews v JOIN 
(
    SELECT users_id, MIN(time_in) time_in 
    FROM pageviews 
    GROUP BY users_id 
) q ON v.users_id = q.users_id AND v.time_in = q.time_in 
WHERE v.articles_id = 1 

輸出:

 
| USERS_ID | 
------------ 
|  1 | 
|  2 | 

這裏是SQLFiddle演示

+0

完美答案... –

+0

謝謝!我發現這篇文章(http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/)不僅肯定你的答案的功能,也是最佳的表現。 –

+0

非常歡迎。我很高興我可以幫助:) – peterm

0

另一種方式:

SELECT users_id 
FROM pageviews p 
WHERE articles_id = 1 
AND time_in = (SELECT MIN(time_in) from pageviews p2 WHERE p2.users_id = p.users_id) 

SQLFiddle here

相關問題