2016-08-05 3 views
2

MySQL # 1235 - Эта версия MySQL не поддерживает 'LIMIT & IN/ALL/ANY/SOME подзапрос'MySQL выбрать не равным пределу в подзапроса

Учитывая 1 таблицу следующим образом

Item | Name  | Price 
----- ------------ -------- 
1 | Adidas  | 310.00 
2 | Nike Run | 30.00 
3 | Puma  | 150.00 
4 | Nike Women | 20.00 
5 | NB   | 20.00 

Хочет выбрать записи и вернуть сумму. Не суммируйте рекорд двух самых высоких цен.

SELECT SUM(Price) as total_amount 
FROM `test` 
WHERE Item NOT IN (
    SELECT Price 
    FROM `test` 
    ORDER BY Price DESC 
    LIMIT 2) 

Ожидаемый результат:

total_amount 
------------ 
    70.00 

Как использовать JOIN или альтернативный LIMIT в подзапрос в данном запросе?

спасибо.

+0

Я думаю, что ваш подзапрос имеет опечатку. –

ответ

1

Вот один вариант с использованием подзапроса с limit/offset:

select sum(price) 
from (
    select * 
    from test 
    order by price desc 
    limit 999999999 
    offset 2 
) t 

Просто убедитесь, что предельное значение больше, чем количество потенциальных строк (что, очевидно, является 18446744073709551615). ..

Или вы могли бы использовать user-defined variables:

select sum(price) 
from (
    select *, @rn:[email protected] + 1 rn 
    from test cross join (select @rn:= 0) t 
) t 
where rn > 2 

Если вы хотите исключить 2 самые высокие цены, которые могут быть более чем 2 записи, это также будет работать с user defined variables:

select sum(price) 
from (
    select *, @rn:=if(@prevPrice=price, @rn, 
        if(@prevPrice:=price, @rn + 1, @rn + 1)) rn 
    from test cross join (select @rn:= 0, @prevPrice:= null) t 
) t 
where rn > 2 
+0

@ sgeddes..когда существуют связи для максимального значения ... этот запрос будет включать в себя второе максимальное значение в сумме. –

+0

@vkp - хорошая точка, возможно, должна быть лучше определена ОП. – sgeddes

+0

@vkp - отредактировано с альтернативным решением для обеих опций с использованием 'user-defined variables' ... – sgeddes

0

Вы требуется временная таблица:

SELECT SUM(Price) FROM test WHERE Item NOT IN (
    SELECT * FROM (
     SELECT Item FROM test ORDER BY Price DESC LIMIT 2 
    ) AS tmp 
)