根据SQL select的条件获取第一个id

时间:2017-07-31 09:41:32

标签: mysql sql

我不太了解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

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秒。