选择第一个结果为特定值的行

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个回答

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 演示


谢谢!我找到了这篇文章,它不仅证实了你的答案的功能性,而且还提供了最佳性能。 - George Yates

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接