2016-08-05 17 views
2

MySQL # 1235 zu begrenzen - Diese Version von MySQL noch nicht unterstützt 'LIMIT & IN/ALL/ANY/SOME Unterabfrage'MySQL nicht gleich wählt in Unterabfrage

Gegeben 1 Tabelle wie folgt

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 

Möchten Datensätze auswählen und den Summenbetrag zurückgeben. Fassen Sie nicht die 2 höchsten Preise zusammen.

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

Erwartetes Ergebnis:

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

Wie verwenden JOIN oder alternatives LIMIT in Subquery in dieser Abfrage?

Vielen Dank.

+0

Ich denke, Ihre Unterabfrage hat einen Tippfehler. –

Antwort

1

Hier ist eine Option mit einer Unterabfrage mit limit/offset:

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

So stellen Sie sicher, dass der Grenzwert größer ist als die Anzahl der potentiellen Zeilen (was offensichtlich ist 18446744073709551615). ..

Oder Sie könnten user-defined variables:

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

Wenn Sie die 2 höchsten Preise ausschließen suchen, die mehr als 2 Datensätze sein könnte, wird dies auch mit user defined variables arbeiten:

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..wenn es Verbindungen für den Maximalwert gibt..diese Abfrage würde den zweiten Maximalwert in der Summe enthalten. –

+0

@vkp - guter Punkt, muss vielleicht besser durch das OP definiert werden. – sgeddes

+0

@vkp - bearbeitet mit einer alternativen Lösung für beide Optionen mit 'benutzerdefinierten Variablen' ... – sgeddes

0

Sie brauche eine temporäre Tabelle:

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