I have the following table (simplification of the real problem):
+----+-------+
| id | value |
+----+-------+
| 1 | T |
| 2 | T |
| 3 | F |
| 4 | T |
+----+-------+
Now a simple SELECT id FROM Table WHERE value='T';
would get me all the IDs where value is T, but I just need, in the example above, the first 2 (1 and 2).
What is the best way to do this? I'd prefer not to use a while loop.
I tagged it MySQL, but a solution working for most database engines would be better.
Edit: based on the answers, I probably wasn't clear enough:
I only want the first IDs where value is 'T'. This can be anything from no values to all values.
Edit 2: another example:
+----+-------+
| id | value |
+----+-------+
| 1 | F |
| 2 | T |
| 5 | T |
| 6 | F |
| 7 | T |
| 9 | T |
+----+-------+
The result would be [].
Example 3:
+----+-------+
| id | value |
+----+-------+
| 1 | T |
| 2 | T |
| 5 | T |
| 6 | F |
| 7 | T |
| 9 | T |
+----+-------+
And the result: [1, 2, 5]
Are you after something as simple as this? just limiting the result?
select id from table where value = 'T' order by id asc limit 2
Just change the order to desc
instead of asc
if for some reason you want the last two matches, instead of the first two.
I see the criteria has changed a little.
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'
If you want no results when the first value is 'F', then this one:
select id
from `table` t
where
not exists (select id from `table` t3 where value = 'F' and id < t.id)
and value = 'T'