2016-12-10 113 views
0

我想知道是否可以在LIMIT中使用子查詢。LIMIT中的MYSQL子查詢

我想使用這個的原因是返回最佳購買客戶的20%(1/5)。

例如(儘管這顯然不工作):

SELECT id, revenue 
FROM customers 
ORDER BY revenue DESC 
LIMIT (SELECT (COUNT(*)/5) FROM customer) 

有沒有一種方法,使在一個限制的子查詢,或以不同的方式回報20%?

+0

http://stackoverflow.com/questions/4741239/select-top-x-or-bottom-percent-for-numeric-values-in-mysql的http://計算器。 com/questions/4741239/select-top-x-or-bottom-percent-for-numeric-values-in-mysql –

+2

請用你正在使用的數據庫標記你的問題。 –

回答

0

這樣使用ANSI SQL的典型方法是使用窗口函數:

SELECT id, revenue 
FROM (SELECT c.*, 
      ROW_NUMBER() OVER (ORDER BY revenue DESC) as seqnum, 
      COUNT(*) OVER() as cnt 
     FROM customers 
    ) c 
WHERE seqnum <= cnt * 0.2 
ORDER BY revenue DESC; 

大多數數據庫支持這些功能。

MySQL是少數幾個不支持窗口函數的數據庫之一。您可以使用變量:

SELECT id, revenue 
FROM (SELECT c.*, (@rn := @rn + 1) as rn 
     FROM customers c CROSS JOIN 
      (SELECT @rn := 0) params 
     ORDER BY c.revenue DESC 
    ) c 
WHERE rn <= @rn/5; -- The subquery runs first so @rn should have the total count here. 
+0

它不適合我。我在 ROW_NUMBER()OVER(order by revenue DESC)處得到一個錯誤seqnum。 難道是因爲我使用MYSQL? – Colin

+0

@Colin。 。 。是的,這就是我編輯答案的原因。 –

+0

謝謝,哇,這工作。不知道爲什麼哈哈,但我會編輯它爲我的實際表格工作。 – Colin