2013-08-23 2 views
0

Я строящий следующий запрос:Один дополнительный ряд в запросе колонка суммы

SELECT taskid 
FROM tasks, (SELECT @var_sum := 0) a 
WHERE (@var_sum := @var_sum + taskid) < 10 

Результат:

taskid 
1 
2 
3 

сейчас это возвращении мне все строк, которые при суммировании является < 10, я хочу добавить одну дополнительную строку к моему результату (10 может быть чем угодно, но это всего лишь примерное значение)

Итак, желаемый результат:

taskid 
1 
2 
3 
4 
+2

использовать '<=' вместо '<'? как 6+ 4 ... = 10 (о да) –

+0

Это работает на 10, но не на 5 - например. –

+1

О, кажется, вам лучше объяснить, что вы хотите ... –

ответ

1

Я хотел бы сделать это следующим образом:

SELECT t.taskid 
    FROM tasks t 
CROSS 
    JOIN (SELECT @var_sum := 0) a 
WHERE IF(@var_sum<10, @var_sum := @var_sum+t.taskid, @var_sum := NULL) IS NOT NULL 

Это проверка, если текущее значение @var_sum меньше, чем 10 (или меньше, чем любой другой, или меньше или равна любой другой Если мы. добавьте значение taskid в @var_num, и строка будет включена в набор результатов. Но если текущее значение @var_sum не удовлетворяет условию, мы присваиваем ему NULL, и строка не включается.

ПРИМЕЧАНИЕ Порядок строк, возвращаемых из таблицы tasks, не гарантируется. SQL может возвращать строки в любом порядке; он может выглядеть детерминированным в вашем тестировании, но это, скорее всего, потому, что MySQL выбирает один и тот же план доступа по тем же данным.

+0

Это сработало отлично! Я тоже буду следить за вашей запиской. –

1

Если вы хотите, первое значение, которое «> = 10»:

SELECT taskid 
FROM tasks, (SELECT @var_sum := 0) a 
WHERE (@var_sum < 10) or (@var_sum < 10 and @var_sum := @var_sum + taskid) >= 10); 

Несмотря на это (возможно) на практике, я не думаю, что гарантированно работает. MySQL не определяет порядок оценки для предложений where.

EDIT:

Это должно работать:

select taskid 
from (SELECT taskid, (@var_sum := @var_sum + taskid) as varsum 
     FROM tasks t cross join 
      (SELECT @var_sum := 0) const 
    ) t 
WHERE (varsum < 10) or (varsum - taskid < 10 and varsum >= 10); 
+0

Первый запрос возвращает только одну строку. Второй запрос - Неизвестный столбец 'var_sum' в 'where clause' –

+0

@JoaoFerreira. , , Исправлена ​​проблема. Когда вы сталкиваетесь с этой проблемой, я обычно просто хочу, чтобы первая строка достигла определенного значения, а не все значения, которые приводят к этому. –

+0

Теперь ваш запрос возвращает мне синтаксическую ошибку SQL LIMIT 0, 50 'в строке 3, у меня ограниченный опыт SQL, но не могу понять, почему логика имеет смысл для меня сейчас. –

0

Чтобы добавить дополнительные строки использовать UNION ALL то код, что вы хотите для дополнительной строки:

SELECT taskid 
FROM tasks, (SELECT @var_sum := 0) a 
WHERE (@var_sum := @var_sum + taskid) < 10 
UNION ALL 
SELECT 4 

Потому что вы не сказал, что вы получаете дополнительный рилл, я закодировал постоянную ценность, но вы можете изменить его на все, что вам нужно.

Смежные вопросы