2015-04-30 3 views
0

У меня есть следующие таблицы (упрощение реальной проблемы):Как выбрать только первые элементы, удовлетворяющие условию?

+----+-------+ 
| id | value | 
+----+-------+ 
| 1 | T  | 
| 2 | T  | 
| 3 | F  | 
| 4 | T  | 
+----+-------+ 

Теперь простой SELECT id FROM Table WHERE value='T'; бы получить мне все идентификаторы, где значение Т, но мне просто нужно, в приведенном выше примере, первые 2 (1 и 2).

Каков наилучший способ для этого? Я бы предпочел не использовать цикл while.

Я отметил его MySQL, но решение, работающее для большинства движков баз данных, было бы лучше.

Редактировать: на основании ответов я, вероятно, был недостаточно ясен:
Мне нужны только первые идентификаторы, где значение равно «T». Это может быть что угодно: от значений до всех значений.

Изменить 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]

+0

Я обновил свой ответ с обновленными требованиями. –

ответ

1

Вы после того, как что-то так просто, как это? просто ограничивая результат?

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' 

demo here

Если вы не хотите никаких результатов, когда первое значение 'F', то этот один:

select id 
    from `table` t 
    where 
     not exists (select id from `table` t3 where value = 'F' and id < t.id) 
    and value = 'T' 
+0

Я не думаю, что ему нужно сортировать или заказывать –

+0

Без заказа «первые две» не имеют никакого значения. И поскольку он специально запрашивал значения с наименьшим id, сортировка подходит –

+0

Я предполагаю, что идентификатор будет автоматически увеличиваться, поскольку мы устанавливаем значение по умолчанию PK как автоматически увеличивающееся. –

0

Попробуйте с LIMIT 2 ниже

SELECT id 
FROM Table 
WHERE value='T' 
ORDER BY id 
LIMIT 2 
1

Если Идентификаторы автоматически увеличиваются, затем order bylimit может использовать

select * from table_name where value = 'T' order by id limit 2 
+0

Спасибо за ваш ответ. См. Мое редактирование. Я, вероятно, был недостаточно ясен. – Burkhard

+0

Не могли бы вы привести еще один пример, если я правильно понял из данного примера, '1,2' сохраняют' T', а '3' - 'F', а затем' 4' с 'T', как только он достигнет 3 с другим значением, которое он должен остановить, это то, на что вы смотрите? И если так, что произойдет, если у вас есть '5' с' T' и так далее? –

+0

Теперь кажется довольно ясным. –

0

Если вам не нужны какие-либо порядок сортировки или в данных

SELECT id FROM Table WHERE value='T' limit 0,2 

Вам может понадобиться добавить «ORDER BY», если вы хотите сделать заказ по идентификатору. например

SELECT id FROM Table WHERE value='T' order by id limit 0,2 
0

Вы можете получить идентификатор первого вхождения «F», а затем использовать его в состоянии.
Вы могли бы сделать что-то вроде этого:

SELECT id FROM tables where id < (select AVG(id) FROM tables WHERE value = 'F' ORDER BY id LIMIT 1) 
+0

Что вы * намереваетесь * при использовании 'AVG (id)'? Что делать, если в конце таблицы есть три записи, которые являются «F»? Скажите id 98, 99 и 100. «AVG (id)» возвращает 99, что означает, что ваш внешний запрос будет содержать строку 98, которая, если «F» и OP, и хочет «T». Это, кажется, не имеет никакого смысла для меня вообще. – MatBailie

+0

Что делать, если записи '{F, F, F, T, T}'? Тогда ваш запрос возвращает первый 'F' и ни один из' T '... – MatBailie

+0

@MatBailie, поэтому запись ограничивается только 1, я просто просто предполагаю, что запрос возвращает коллекцию, даже если есть только 1 запись , Я не говорю, что получение среднего числа идентификаторов - это правильный путь. Возможно, лучший способ, но идея заключается в получении идентификатора и использовании в состоянии. – Apple