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,则查询只会返回 user 0

到目前为止,这是我的查询:

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

但这会为所有已阅读文章的用户返回不同的用户 ID 1,而不是过滤掉没有将其视为第一个结果的用户。我觉得我的查询方向错误,所以我转向你们。

提前致谢。

4

2 回答 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演示

于 2013-08-20T05:37:01.460 回答
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在这里

于 2013-08-20T05:41:48.760 回答