2013-09-08 3 views
4

Это было легко найти решение для получения следующей строки, имея один идентификатор:Выберите следующие строки из подзапроса результата

SELECT MIN(id) FROM foo WHERE id > ? 

Но что, если я хотел бы иметь следующие идентификаторы (множественное число) из подзапроса результат? Например .:

SELECT id FROM foo WHERE property > 0 

Этот запрос возвращает определенное количество идентификаторов, например .: 1, 2, 4, 6. Допустим, строка с идентификатором 3 уже удалена, а свойство ряда 5 является < 0.

Так что я хочу, это результат так: 2, 4, 5, 7.

Проблема заключается в том, что я не могу объединить эти два запроса, потому что более поздний возвращает более одной строки, очевидно.

Как я могу получить все следующие идентификаторы из подзапроса? Возможно ли это с помощью одного запроса или мне нужно будет использовать процедуры?

+0

Каково практическое применение этого запроса? Идентификационные номера обычно произвольны. Это больше похоже на головоломку, чем на проблему программирования в реальном мире. – Barmar

+0

Причина в том, что у меня есть только 2000 строк, но около 20 свойств и> 2000000 комбинаций свойств, которые я хочу проверить, поэтому мне нужно минимизировать запросы запросов. Упрощенный пример того, чего я пытаюсь достичь: получить avg ° C, где накануне шел дождь. –

+0

Ahh, это не совсем ID, которые вас интересуют, это столбец типа 'date'. – Barmar

ответ

1

Если я читаю это право вы хотите запрос, который будет работать так же, как:

SELECT MIN(id) FROM foo WHERE id > ? 

но для нескольких идентификаторов. Таким образом, вы получаете следующий существующий id в последовательности для определенного списка идентификаторов. Это кажется немного странным, я чувствую, что функциональность, которую вы пытаетесь достичь, возможно, может быть реализована по-другому. Я также предполагаю, что есть веская причина, по которой вы не можете просто получить всю таблицу и найти правильные идентификаторы в любом коде, использующем данные.

Сказав это, да, это можно сделать. У вас уже есть запрос, который получает правильный «следующий» идентификатор, поэтому вы можете присоединиться к таблице против себя, чтобы создать таблицу с двумя столбцами id, один из которых является исходным идентификатором, а другой - «следующий». Затем вы можете отфильтровать эту таблицу по списку исходных идентификаторов и вернуть другой идентификатор. Как что:

SELECT f1.id AS id 
    FROM foo f1, foo f2 
    WHERE f1.id = 
     (SELECT MIN(f3.id) FROM foo f3 WHERE f3.id > f2.id) 
    AND f2.id IN (1, 2, 4, 6) 
; 

На моей системе, которая возвращает 2, 4, 5, 7, если установка я мой стол, как вы описали (не ИН 3, 5 и 7 имеют свойство < = 0).

Этот запрос может быть не самым быстрым из-за большого количества данных.

Я думаю, что это то, что вы хотите сделать, так как developerCK говорит, что вы можете использовать GROUP_CONCAT, если вам нужно кормить результаты property > 0 запроса в запросе.Но если это то, что вы хотите сделать, вы можете пропустить среднего человека и объединить такие запросы:

SELECT f1.id AS id 
    FROM foo f1, foo f2 
    WHERE f1.id = 
     (SELECT MIN(f3.id) FROM foo f3 WHERE f3.id > f2.id) 
    AND f2.property > 0 
; 
+0

Спасибо SpaceDog, это именно то, что я искал. К сожалению, весь подход оказался слишком медленным для моих нужд. Тем не менее, ваш ответ верен и принимается здесь :) –

-1

Я до сих пор не ясно, о запросе, но то, что я понимаю это, эта функция поможет вам,

GROUP_CONCAT() 

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

визит: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

или

http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php

+0

Что делает GROUP_CONCAT для выбора следующей строки после той, которая соответствует критериям? – Barmar

+0

Мне было не ясно о вопросе, но список, разделенный запятыми, может проходить через эту функцию в одной строке. – developerCK

+0

Он не спрашивает, как получить список, разделенный запятыми. Это было именно то, как он перечислял идентификаторы, которые он хочет в результате. – Barmar