2010-06-23 20 views
2

我有這樣如何選擇與MySQL集合函數返回的行對應的列值?

 date    user_id   page_id 
2010-06-19 16:00:00   1    4 
2010-06-19 16:00:00   3    4 
2010-06-20 07:10:00   1    1 
2010-06-20 12:00:10   1    2 
2010-06-20 12:00:10   1    3 
2010-06-20 13:05:00   2    1 
2010-06-20 14:10:00   3    1 
2010-06-21 17:00:00   2    1   

我想寫一個查詢,將返回誰沒有在最後一天訪問那些用戶的最後PAGE_ID的表。

所以,我能找到誰沒有在最後一天訪問:

SELECT user_id, MAX(page_id) 
FROM page_views GROUP BY user_id 
HAVING MAX(date) < DATE_SUB(NOW(), INTERVAL 1 DAY); 

但是,我怎麼能找到這些用戶最後一次查看的PAGE_ID?即我想知道哪個page_id對應MAX(date)的同一行中的值。在每個日期有多個頁面瀏覽的情況下,我可以選擇MAX(page_id)。

從上面的預期輸出應該是(如果NOW()返回2010-06-21 18:00:00):

user_id  page_id 
    1   3 
    3   1 
  • USER_ID 1在2010-上次訪問過了一天前 06-20 12:00:10, MAX(page_id)爲3.
  • user_id 2 last visited than less a day ago,so are ignored。
  • USER_ID 3上次訪問 在一天前,他們最近 PAGE_ID爲1

我怎樣才能做到這一點?我只需要使用SQL。我正在使用一個MySQL衍生產品,它要求SELECT子句中的所有列都要在GROUP BY子句中聲明(它更符合標準)。

謝謝。

回答

1

我可以看到不同的方法。 例如:

select a.user_id, a.page_id 
from page_views a 
inner join (SELECT user_id, MAX(date) as date 
FROM page_views GROUP BY user_id 
HAVING MAX(date) < DATE_SUB(NOW(), INTERVAL 1 DAY)) b on a.user_id = b.user_id 
    and a.date = b.date 

它可以實現更有效的MS SQL或Oracle與窗函數。

另一個想法:

select a.user_id, a.page_id 
from page_views a 
where date < DATE_SUB(NOW(), INTERVAL 1 DAY) 
    and not exist(select 1 from page_views b 
     where a.user_id = b.user_id and b.date > a.date) 
+0

我不知道是否有可能有幾個PAGE_ID在同一時間同一USER_ID。 如果是的話,你可能需要添加分組到這個查詢 – burnall 2010-06-23 09:53:39

+0

這很好,謝謝。我不知道你可以加入多列,並且我忘記了EXIST關鍵字。 – 2010-06-23 10:09:02