如何只select第一个满足条件的元素?
How to select only the first elements satisfying a condition?
我有以下table(真实问题的简化):
+----+-------+
| id | value |
+----+-------+
| 1 | T |
| 2 | T |
| 3 | F |
| 4 | T |
+----+-------+
现在,一个简单的 SELECT id FROM Table WHERE value='T';
就能得到值为 T 的所有 ID,但在上面的示例中,我只需要前 2 个(1 和 2)。
最好的方法是什么?我不想使用 while 循环。
我标记了它 MySQL,但适用于大多数数据库引擎的解决方案会更好。
编辑:根据答案,我可能不够清楚:
我只想要值为 'T' 的第一个 ID。这可以是从无值到所有值的任何值。
编辑 2:另一个例子:
+----+-------+
| id | value |
+----+-------+
| 1 | F |
| 2 | T |
| 5 | T |
| 6 | F |
| 7 | T |
| 9 | T |
+----+-------+
结果为 [].
示例 3:
+----+-------+
| id | value |
+----+-------+
| 1 | T |
| 2 | T |
| 5 | T |
| 6 | F |
| 7 | T |
| 9 | T |
+----+-------+
结果:[1, 2, 5]
你想要这么简单的东西吗?只是限制结果?
select id from table where value = 'T' order by id asc limit 2
如果出于某种原因您想要最后两场比赛而不是前两场比赛,只需将顺序更改为 desc
而不是 asc
。
我看到标准有点变化了。
select id
from `table` t
where t.id >= (select @min := min(id) from `table` t2 where value = 'T')
and not exists (select id from `table` t3 where value = 'F' and id > @min and id < t.id)
and value = 'T'
如果您不想在第一个值为 'F' 时没有结果,那么这个:
select id
from `table` t
where
not exists (select id from `table` t3 where value = 'F' and id < t.id)
and value = 'T'
尝试使用 LIMIT 2
如下所示
SELECT id
FROM Table
WHERE value='T'
ORDER BY id
LIMIT 2
如果 ID 自动递增,则可以使用 order by
limit
select * from table_name where value = 'T' order by id limit 2
如果您不需要对数据进行任何排序或排序
SELECT id FROM Table WHERE value='T' limit 0,2
如果您想按 ID 订购,您可能需要添加 'ORDER BY'。例如
SELECT id FROM Table WHERE value='T' order by id limit 0,2
您可以获得第一次出现的 'F' 的 ID,然后在条件中使用。
你可以这样做:
SELECT id FROM tables where id < (select AVG(id) FROM tables WHERE value = 'F' ORDER BY id LIMIT 1)
我有以下table(真实问题的简化):
+----+-------+
| id | value |
+----+-------+
| 1 | T |
| 2 | T |
| 3 | F |
| 4 | T |
+----+-------+
现在,一个简单的 SELECT id FROM Table WHERE value='T';
就能得到值为 T 的所有 ID,但在上面的示例中,我只需要前 2 个(1 和 2)。
最好的方法是什么?我不想使用 while 循环。
我标记了它 MySQL,但适用于大多数数据库引擎的解决方案会更好。
编辑:根据答案,我可能不够清楚:
我只想要值为 'T' 的第一个 ID。这可以是从无值到所有值的任何值。
编辑 2:另一个例子:
+----+-------+
| id | value |
+----+-------+
| 1 | F |
| 2 | T |
| 5 | T |
| 6 | F |
| 7 | T |
| 9 | T |
+----+-------+
结果为 [].
示例 3:
+----+-------+
| id | value |
+----+-------+
| 1 | T |
| 2 | T |
| 5 | T |
| 6 | F |
| 7 | T |
| 9 | T |
+----+-------+
结果:[1, 2, 5]
你想要这么简单的东西吗?只是限制结果?
select id from table where value = 'T' order by id asc limit 2
如果出于某种原因您想要最后两场比赛而不是前两场比赛,只需将顺序更改为 desc
而不是 asc
。
我看到标准有点变化了。
select id
from `table` t
where t.id >= (select @min := min(id) from `table` t2 where value = 'T')
and not exists (select id from `table` t3 where value = 'F' and id > @min and id < t.id)
and value = 'T'
如果您不想在第一个值为 'F' 时没有结果,那么这个:
select id
from `table` t
where
not exists (select id from `table` t3 where value = 'F' and id < t.id)
and value = 'T'
尝试使用 LIMIT 2
如下所示
SELECT id
FROM Table
WHERE value='T'
ORDER BY id
LIMIT 2
如果 ID 自动递增,则可以使用 order by
limit
select * from table_name where value = 'T' order by id limit 2
如果您不需要对数据进行任何排序或排序
SELECT id FROM Table WHERE value='T' limit 0,2
如果您想按 ID 订购,您可能需要添加 'ORDER BY'。例如
SELECT id FROM Table WHERE value='T' order by id limit 0,2
您可以获得第一次出现的 'F' 的 ID,然后在条件中使用。
你可以这样做:
SELECT id FROM tables where id < (select AVG(id) FROM tables WHERE value = 'F' ORDER BY id LIMIT 1)