有这个表:
+----+-------+---------+-----+
| id | group | name | age |
+----+-------+---------+-----+
| 1 | a | John | 11 |
+----+-------+---------+-----+
| 2 | a | Rachel | 12 |
+----+-------+---------+-----+
| 3 | a | Sarah | 11 |
+----+-------+---------+-----+
| 4 | a | Joe | 14 |
+----+-------+---------+-----+
| 5 | b | Richard | 13 |
+----+-------+---------+-----+
| 6 | b | Zoe | 12 |
+----+-------+---------+-----+
我想写一个查询,这样我就可以得到从表(id = 1
)的开始到group = 'b'
的所有值,所以我得到一个这样的表:
+----+-------+--------+-----+
| id | group | name | age |
+----+-------+--------+-----+
| 1 | a | John | 11 |
+----+-------+--------+-----+
| 2 | a | Rachel | 12 |
+----+-------+--------+-----+
| 3 | a | Sarah | 11 |
+----+-------+--------+-----+
| 4 | a | Joe | 14 |
+----+-------+--------+-----+
有人能帮我吗?非常感谢!
您可以执行这样的查询:
select tt.*
from thistable tt
where tt.id < (select min(tt2.id) from thistable tt2 where tt2.`group` = 'b');
请注意,对于列名来说,group
是一个糟糕的名称,因为它是一个保留字。
如果您不知道组值,并且想要获得第一个值,则可以使用用户定义的变量,或者简单地说,可以使用秩查询
select `id`, `group`, `name`, `age`
from (
select t.* ,
@r:= case when @g = t.`group` then @r else @r+1 end `row`,
@g:=t.`group`
from t
cross join(select @g:='',@r:=0) t1
order by t.id , t.`group`
) t2
where `row` = 1
Demo
注意,我已经使用表中的id列对结果进行了排序,所以如果您没有按顺序排列的组记录,则将顺序更改为
order by t.`group`
如果你只想要一个sql查询,它将看起来像这个
Select * from myTable where group='a';