Table: Activity
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
+--------------+---------+
(player_id, event_date) 是这个表的两个主键
这个表显示的是某些游戏玩家的游戏活动情况
每一行是在某天使用某个设备登出之前登录并玩多个游戏(可能为0)的玩家的记录
请编写一个 SQL 查询,描述每一个玩家首次登陆的设备名称
查询结果格式在以下示例中:
Activity table:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-05-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
+-----------+-----------+------------+--------------+
Result table:
+-----------+-----------+
| player_id | device_id |
+-----------+-----------+
| 1 | 2 |
| 2 | 3 |
| 3 | 1 |
+-----------+-----------+
解答:
select player_id, device_id
from activity
where (player_id, event_date) in
(select player_id, min(event_date)
from activity
group by player_id)
知识点:
where限制条件后面如果想要加select语句的话,如何实现?
通常情况下,where后面跟的是:clomn=值的方式,其实,=号后面也是可以使用查询语句的,=(select cloumn from table),但有使用限制条件。
使用条件:
第一,使用()包住;
第二,select的查询结果集只能为1(只返回一条数据)。
而使用in()或者exists()函数,则基本上没有限制条件。
当限制条件where后面字段的值可能有多个时,我们可以使用in(select …)或exists(select …)来实现;
in 和 exists的区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists;
但如果不走索引的话,则它俩的执行效率没有太大差别。
这里感谢————————————————
版权声明:本文为CSDN博主「weixin_39992417」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39992417/article/details/113724727