我有一个自定义编写的分析系统正在运行,我正在尝试编写一个查询,以返回登陆特定页面的用户作为他们的第一个匹配。表格的相关部分是这样设置的,有一些简单的数据:
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,而不是像这个简单示例中的int。
现在,如果我想看看谁首先阅读文章1
,我希望我的查询返回用户1
和2
,而不是0
,用户0
看到文章0
是他们在网站上的第一个热门内容。相反,如果我想先查看谁阅读了文章0
,则该查询只会返回用户0
。
到目前为止,这是我的查询:
SELECT
*
FROM
pageviews
WHERE
articles_id = 1
GROUP BY
users_id
ORDER BY
time_in
但是,这会为阅读过文章1
的所有用户返回不同的用户ID,而不是过滤掉那些没有将其视为第一个结果的用户。我觉得我的查询方向错误,所以我转向你们。
提前致谢。
答案 0 :(得分: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 演示
答案 1 :(得分: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 强>