我不太了解SQL,你能指出我做错了什么吗?
我有一个用户活动的数据库。我想做一些统计数据,我想知道在状态完成时已完成用户的第一个活动的ID。
表活动;行:ID,user_id,status ...状态可以是0
表示失败,1
表示已完成。有人能指出我如何做到正确,因为当我这样做时:
SELECT MIN(activity.ID)
FROM activity
WHERE activity.status=1
GROUP BY activity.username
我将获得第一个没有为用户做过的活动的ID,但是我需要它只是一般的第一个活动而且没有完成。 接下来我认为我尝试做的是从选择中选择,但我做不到或者我需要联合。
SELECT activity.ID
FROM ( SELECT MIN(ID) FROM activity GROUP BY username ) a
WHERE ID.a=activity.ID AND activity.status=1
我认为我在SQL逻辑中做了一些错误的事情,有人能指出我这种查询的好逻辑。 TX。提前。
More exact what I need
我需要所有活动的id,这是第一个没有完成用户任务的活动,就像在这个表中一般存储所有用户的所有活动。输出示例
Table activity
ID USER_id Status
0 001 0
1 001 1
2 002 1
3 002 1
4 004 1
5 003 0
6 003 0
7 003 1
8 004 1
9 004 0
10 001 1
我想要的输出是ID:2,4
答案 0 :(得分:1)
你的问题并不完整清楚,但是如果你想首先在status = 1的地方使用id,那么请使用这个sql来帮助你,并且你的id必须需要主键
SELECT min(ID) FROM activity WHERE status =1 GROUP BY USER_id ORDER BY min(ID) asc;
希望它会帮助你
答案 1 :(得分:1)
Select id from activity
where status = 1 and id in
(select id from activity group by user_id)
子查询为您提供用户的第一个活动的ID,其余外部查询将为您执行此操作。 希望这能解决问题!
答案 2 :(得分:0)
首先,您需要找到每个用户的第一个操作:
select min(id) user_id
from activity
group by user_id
完成后,确定它是否成功并仅列出成功用户:
SELECT DISTINCT user_id
FROM activity
JOIN (
SELECT MIN(id) user_id
FROM activity
GROUP BY user_id
) t_id USING (user_id)
WHERE
status=1
答案 3 :(得分:0)
@Shuddh发布的解决方案很好,但我找到了一个如何优化它的解决方案。
SELECT `id`
FROM `activity`
JOIN (SELECT `id` FROM activity GROUP BY `user_id`) `a` ON `user_id`=`a`.user_id
WHERE `status` = 1
据我所知,根据一些文章,联合会更快地完成。而且我的数据库速度更快,从40秒到15秒。