我有以下employee_sequence表
| id | employee_id | sequence_id | is_completed |
|----|:-----------:|:-----------:|:------------:|
| 1 | 12 | 3 | 1 |
| 2 | 12 | 4 | 1 |
| 3 | 10 | 3 | 1 |
| 4 | 10 | 4 | 0 |
我正在寻找如何在1个查询中获取员工的is_completed = 0的第一行。如果该员工没有这样的行,则采用is_completed = 1
的第一行employee_id = 12(不存在is_completed = 0,因此第一行具有is_completed = 1)的示例
| id | employee_id | sequence_id | is_completed |
|----|:-----------:|:-----------:|:------------:|
| 1 | 12 | 3 | 1 |
employee_id = 10(第一行具有is_completed = 0)的示例
| id | employee_id | sequence_id | is_completed |
|----|:-----------:|:-----------:|:------------:|
| 4 | 10 | 4 | 0 |
答案 0 :(得分:1)
如果yu正在运行MySQL 8.0,则可以使用row_number()
。假设可以使用id
来对记录进行排序,则可以这样写:
select *
from (
select es.*, row_number() over(partition by employee_id order by is_completed, id) rn
from employee_sequence es
) es
where rn = 1
在更高级的版本中,另一种选择是带有行限制子句的相关子查询:
select *
from employee_sequence es
where es.id = (
select es1.id
from employee_sequence es1
where es1.employee_id = es.employee_id
order by es1.is_completed, es.id
limit 1
)
答案 1 :(得分:1)
如果您要每个员工这个 (如您的问题所建议):
public static void removeMid(ArrayList<Integer> o){
int i=0;
int low=0;
int high=o.size()-1;
int mid=(high+low)/2;
if(o.get(i)!=mid)
return ;
else if(o.get(i)==mid) {
o.remove(i);
System.out.println(o.get(i)); //return mid element
System.out.println(o);
removeMid(o);
}}```
Here是db <>小提琴。
答案 2 :(得分:0)
如果运行的内容少于MySql 8,则:
select * from employee_sequence e1
where e1.id = (
select e2.id
from employee_sequence e2
where e2.employee_id = e1.employee_id
order by e2.is_completed, e2.sequence_id
limit 1
);
| id | employee_id | sequence_id | is_completed |
| --- | ----------- | ----------- | ------------ |
| 1 | 12 | 3 | 1 |
| 4 | 10 | 4 | 0 |